Use set -x para ver o que o comando realmente é depois que o shell o expande. Acontece que
printf [abcd]*[abcd]
em seu diretório é de fato
printf a.b ab.c b.a b.c c.d
Agora, printf trata a.b como FORMATO (consulte man 1 printf ) . Não inclui %s nem nada disso, é por isso que o restante dos argumentos não importam e o literal a.b é impresso.
Se você quiser que printf se comporte mais como echo , especifique o formato desejado, por exemplo:
printf '%s\n' [abcd]*[abcd]
imprimirá
a.b ab.c b.a b.c c.d
(Nota: use set +x para reverter set -x depois de concluir o teste.)