Você precisa agrupar as seqüências não impressas em %{ ... %}
:
PROMPT=$'%{\e[0;31m%}%n@%m:%~> %{\e[0m%}'
Você deve ser capaz de fazer:
PROMPT=$'%F{red}%n@%m:%~> %f'
que é mais simples, mais fácil de ler e funciona com tipos de terminal que usam diferentes seqüências de escape.