Acredito ter uma explicação técnica razoavelmente concisa. Estamos lidando com um CLI (Interpretador de linha de comando) e os resultados da substituição de comando dependem da fase de interpretação quando o analisador encontra o token de substituição "$ (".
cmd="date"
Atribuição simples; variável "cmd" tem a string "data".
var=$(echo $cmd)
$(echo $cmd)
No primeiro caso, o analisador (que lê da esquerda para a direita) encontrou um token "=" para saber que está esperando uma sequência de equivalência para uma atribuição de variável.
No segundo caso, o analisador não determinou o tipo de comando com o qual estava lidando, quando atingiu "$ (".
Em ambos os casos, a análise é pausada e um ambiente de subshell é criado. A cadeia entre os parênteses é interpretada pela CLI e o conteúdo da stdout é usado para substituir "$ (", o parêntese à direita correspondente, sem aspas e tudo entre. Agora, a CLI retoma de onde parou. Neste exemplo, em Em ambas as instâncias, o stdout contém a string "date" .Na primeira instância, o CLI estava esperando uma string de equivalência, então interpreta "var = date" como atribuindo a string "date" à variável "var".
Na segunda instância, a CLI interpreta "data". Como date é um programa válido no caminho atual, esse programa é chamado.
Então, nada está realmente errado, é apenas a maneira como o intérprete realiza a substituição.