Você está usando este comando
ln -s ../*/*txt TXT/
Se você estiver no diretório que contém a , b e TXT , o shell não conseguirá expandir ../*/*txt para corresponder a algo em a ou b . Você teria que usar */*txt para isso, mas, em seguida, os links simbólicos dentro de TXT seriam desativados em um nível e precisariam de outro ../ em seus caminhos relativos.
A solução mais fácil seria essa, mas você diz que quer evitar cd
( cd TXT && ln -s ../*/*txt . )
Outra solução exigiria a correção dos links, por sua vez
for f in */*txt
do
ln -s ../"$f" TXT
done
Lembre-se de que, como você tem seus diretórios de origem a e b no mesmo nível que TXT , os curingas nas duas sugestões corresponderão a todos os três diretórios.