Parâmetros e outros tipos de expansões são executados quando o comando é lido, antes de ser executado.
A primeira versão,, LANG=Ja_JP bash -c "echo $LANG"é um único comando. Depois de analisado como tal, $LANGé expandido para en_USantes de qualquer coisa ser executada. Uma vez que bashestá terminado o processamento da entrada, ele bifurca um processo, acrescenta LANG=Ja_JPao ambiente como esperado, e então executa bash -c echo en_US.
Você pode impedir a expansão com aspas simples, ou seja, LANG=Ja_JP bash -c 'echo $LANG'saídas Ja_JP.
Observe que, quando você tem uma atribuição de variável como parte de um comando, a atribuição afeta apenas o ambiente desse comando e não o do seu shell.
A segunda versão, LANG=Ja_JP; bash -c "echo $LANG"na verdade , são dois comandos separados executados em sequência. A primeira é uma atribuição simples de variável sem um comando, portanto afeta o shell atual.
Assim, seus dois trechos são fundamentalmente diferentes, apesar da distinção superficial de um único ;.
Completamente fora do tópico, mas recomendo anexar a .UTF-8quando definir LANG. Atualmente, não há uma boa razão para não usar o Unicode no século XXI.