A função de substituição de comandos $()
(e seu primo o backtick) remove especificamente as novas linhas finais. Este é o comportamento documentado e você deve estar sempre ciente disso ao usar a construção.
Novas linhas dentro do corpo do texto não são removidas pelo operador de substituição, mas elas também podem ser removidas quando se faz a divisão de palavras no shell, então, o resultado depende do uso de citações ou não. Observe a diferença entre esses dois usos:
$ echo -n "$(echo -n 'a\nb')"
a
b
$ !! | xxd -p
610a62
$ echo -n $(echo -n 'a\nb')
a b
$ !! | xxd -p
612062
No segundo exemplo, a saída não foi citada e a nova linha foi interpretada como uma divisão de palavras, fazendo com que ela apareça na saída como um espaço!