Se você estiver realmente usando aspas duplas ao definir seu PROMPT , todos os parâmetros serão substituídos na definição e não toda vez que o prompt for impresso. Você pode evitar isso citando $VIRTUAL_ENV de maneira diferente.
Como colocar o prompt inteiro dentro de aspas simples para impedir a substituição de $VIRTUAL_ENV provavelmente interromperá o restante do prompt, tente citar apenas o $ , prefixando um \ , como este
PROMPT="╭─${user_host} ${current_dir} [\${VIRTUAL_ENV}] ${rvm_ruby} ${git_branch}
╰─%B${user_symbol}%b "
Eu suspeito que os outros parâmetros funcionem porque eles são substituídos por algo que é então avaliado a cada vez. Por exemplo, ${user_host} é provavelmente substituído por algo que contenha pelo menos o prompt de escape %n e %m com @ entre.
${LANG} funciona porque já contém o valor esperado quando você define o prompt.
Você pode confirmar isso facilmente executando:
echo $PROMPT