Eles não fazem a mesma coisa. O primeiro é a substituição de comando, o último é a tubulação. O resultado é completamente diferente.
grep foo "$(echo foo)"
procurará a palavra "foo" em um arquivo chamado "foo", porque "foo" é a saída de echo
. echo foo | grep foo
procurará a palavra "foo" da sua entrada STDIN
. No primeiro caso, você provavelmente obterá um erro de arquivo não encontrado. No último caso, você não vai. Eles não são fundamentalmente a mesma operação.