Isso não parece ser documentado † , mas a saída de #() shell-commands em status-left , status-right , window-status-format e window-status-current-format também é processada para #[] color / attribute sequences.
Portanto, apenas imprima as sequências #[] em vez das sequências de escape.
#!/bin/bash
percent=$(ioreg …)
if (( percent > 80 )); then color='#[nobright fg=green]'
elif (( percent > 65 )); then color='#[bright fg=yellow]'
elif (( percent > 40 )); then color='#[bright red]'
else color='#[nobright red]'
fi
echo "$color$percent%"
Faz sentido que sequências de escape completas não sejam interpretadas para essas strings de status: não há muito sentido em fazer (por exemplo) controle de cursor, uma vez que elas são sempre renderizadas em (parte de) uma única linha.
† Acabei navegando pelo código-fonte para descobrir que #[] é interpretado estritamente após todas as outras sequências de # (incluindo #() ). Parece que este sempre foi o caso desde que #[] foi introduzido.