Ese problema es muy específico bashy es porque decidieron bashseparar la expansión de la llave de la expansión del nombre de archivo (globbing) y realizarla primero, antes de todas las otras expansiones.
Desde la página del bashmanual:
El orden de las expansiones es: expansión de llaves; expansión de tilde, expansión de parámetros y variables, expansión aritmética y sustitución de comandos (hecho de izquierda a derecha); división de palabras; y expansión de nombre de ruta.
En su ejemplo, bashsolo verá sus llaves después de haber realizado la sustitución del comando (the $(echo ...)), cuando sea demasiado tarde.
Esto es diferente de todos los otros shells, que realizan la expansión de llaves justo antes (y algunos incluso como parte de) la expansión del nombre de ruta (globbing). Eso incluye, pero no se limita a, cshdónde se inventaron las expansiones de llaves.
$ csh -c 'ls `echo "test{1,2}.txt"`'
test1.txt test2.txt
$ ksh -c 'ls $(echo "test{1,2}.txt")'
test1.txt test2.txt
$ var=nope var1=one var2=two bash -c 'echo $var{1,2}'
one two
$ var=nope var1=one var2=two csh -c 'echo $var{1,2}'
nope1 nope2
Este último ejemplo es el mismo en csh, zsh, ksh93, mksho fish.
Además, observe que la expansión de llaves como parte de globbing también está disponible a través de la glob(3)función de biblioteca (al menos en Linux y todos los BSD), y en otras implementaciones independientes (por ejemplo, en perl:) perl -le 'print join " ", <test{1,2}.txt>'.
Por qué eso se hizo de manera diferente bashprobablemente tenga una historia detrás, pero FWIW no pude encontrar ninguna explicación lógica, y encuentro que todas las racionalizaciones post-hoc no son convincentes.