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.