A limitação não está no shell, mas na família de funções exec() .
O padrão POSIX diz em relação a este :
The number of bytes available for the new process' combined argument and environment lists is
{ARG_MAX}. It is implementation-defined whether null terminators, pointers, and/or any alignment bytes are included in this total.
Para executar utilitários que são construídos no shell, o shell não precisará chamar exec() , por isso não é afetado por esta limitação.
Note, também, que não é simplesmente o tamanho da linha de comando que é limitada, mas a combinação do comprimento do comando, seus argumentos e as variáveis de ambiente atuais e seus valores.
Observe também que printf não é um utilitário incorporado em, por exemplo, pdksh (que funciona como sh e ksh no OpenBSD). Baseando-se em ser um built-in terá que levar em conta o shell específico que está sendo usado.