A|B
executa A e B (em paralelo), e a saída padrão de A é alimentada na entrada padrão de B. No caso de
A $(B)
o shell executa primeiro B, coleta a saída padrão de B e executa A, mas para esta execução atribui a palavra individual ao vetor ARGV de A (isto é, A pode acessar essas palavras pelo mecanismo argv usual de C e outra língua).
Além do fato de que em ambos os casos dois programas A e B estão envolvidos, não vejo nada similar entre eles.