Você precisa escapar dos sinais de dólar para que a substituição do comando não seja avaliada até que o aviso seja emitido:
export PS1="\n\[$txtgrn\]\w\[$txtrst\]\$(hg_in_repo)\[$txtylw\]\$(hg_branch)\[$txtrst\]\$(hg_dirty)\n\[$txtcyn\]\$\[$txtrst\] "
Ou, se você notar nessa página, ele usa aspas simples, o que também impede a expansão da substituição do comando até que o prompt seja emitido:
export PS1='\n\[$txtgrn\]\w\[$txtrst\]$(hg_in_repo)\[$txtylw\]$(hg_branch)\[$txtrst\]$(hg_dirty)\n\[$txtcyn\]\$\[$txtrst\] '