If I was doing it... I'd approach it by attaching a custom script to each widget that's marked as [ExecuteInEditMode]. Inside this script I would have a field that specified what type of a color this widget should be affected by, such as "foreground", "background", "text", etc. I would then set the widget's color in the Update() function after checking to see if the color is actually changing (otherwise the scene will constantly be marked as edited).
I would also add a Start() function that will destroy the script if the application is playing, so that it's not there at run-time.