For now, I've dumped all the color codes I want to a global and then built a subflow that colorizes output using passed params or set environment vars on the subflow. It's not great but it seems to be ok until I can resolve it.
[{"id":"e98b18f5.0a2b08","type":"subflow","name":"Colorized Output","info":"","category":"","in":[{"x":40,"y":40,"wires":[{"id":"ea5fb272.a74cb"}]}],"out":[{"x":400,"y":40,"wires":[{"id":"564fbdb9.ab76e4","port":0}]}],"env":[{"name":"color","type":"str","value":"Green"},{"name":"bgColor","type":"str","value":""},{"name":"bright","type":"bool","value":"true"},{"name":"output","type":"str","value":"Hello World"}],"color":"#DDAA99"},{"id":"564fbdb9.ab76e4","type":"function","z":"e98b18f5.0a2b08","name":"Colorize output","func":"let colors = global.get('logColors');\nlet bright = msg.bright ? colors.Bright : '';\nlet color = msg.color !== '' ? colors.fg[msg.color] : '';\nlet bgColor = msg.bgColor !== '' ? colors.bg[msg.bgColor] : '';\n\nconsole.log(bright, color, bgColor, msg.output, colors.Reset);\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":280,"y":40,"wires":[[]]},{"id":"ea5fb272.a74cb","type":"function","z":"e98b18f5.0a2b08","name":"Vars","func":"msg.color = msg.color || env.get(\"color\");\nmsg.bgColor = msg.bgColor || env.get(\"bgColor\");\nmsg.bright = msg.bright || env.get(\"bright\");\nmsg.ouput === msg.output || env.get(\"output\");\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":130,"y":40,"wires":[["564fbdb9.ab76e4"]]},{"id":"a22b39ce.1863b8","type":"template","z":"98803193.f8aa","name":"","field":"output","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"{{room}} turned off.","output":"str","x":420,"y":1060,"wires":[["7a5b894.db93578"]]},{"id":"7a5b894.db93578","type":"subflow:e98b18f5.0a2b08","z":"98803193.f8aa","name":"Colorized Log Output","env":[],"x":600,"y":1060,"wires":[["325436e6.c5bd8a"]]},{"id":"769f8836.726e58","type":"inject","z":"98803193.f8aa","name":"Timestamp","props":[{"p":"payload"},{"p":"room","v":"Living Room","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":260,"y":1060,"wires":[["a22b39ce.1863b8"]]},{"id":"325436e6.c5bd8a","type":"debug","z":"98803193.f8aa","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","statusVal":"","statusType":"auto","x":790,"y":1060,"wires":[]},{"id":"bf0a73b8.1ca97","type":"template","z":"98803193.f8aa","name":"","field":"output","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"{{room}} turned off.","output":"str","x":420,"y":1120,"wires":[["23b6d894.4192f8"]]},{"id":"23b6d894.4192f8","type":"subflow:e98b18f5.0a2b08","z":"98803193.f8aa","name":"Colorized Log Output","env":[],"x":600,"y":1120,"wires":[["c6252302.3f6ab"]]},{"id":"64911ff0.f763e","type":"inject","z":"98803193.f8aa","name":"Timestamp","props":[{"p":"payload"},{"p":"room","v":"Living Room","vt":"str"},{"p":"color","v":"Blue","vt":"str"},{"p":"bgColor","v":"Red","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":260,"y":1120,"wires":[["bf0a73b8.1ca97"]]},{"id":"c6252302.3f6ab","type":"debug","z":"98803193.f8aa","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","statusVal":"","statusType":"auto","x":790,"y":1120,"wires":[]}]