parseInt(val, 10) macht aus dem String eine Zahl. Damit ist die Maßeinheit weg.
Mache doch einen Stringvergleich:
{v:ble.0.c4:7c:8d:63:7d:91.humidity;v < '20 %' ? "#d60505" :: v < '60 %' ? "#14d229" :: "#1d14d2"}
So ist es ein Zahlenvergleich (ohne Maßeinheit):
{v:parseInt(ble.0.c4:7c:8d:63:81:66.humidity, 10);v < 20 ? "#d60505" :: v < 60 ? "#14d229" :: "#1d14d2"}