You are right that there is unlikely to be any further upgrade to 1.x generation hardware — due to the limited program memory and RAM size of atmega328, any additional feature will be at the cost of removing an existing feature. So it’s gonna be very tricky to optimize everything.
The workaround you described is certainly an option. Another way is to modify the firmware source code to customize how the rain_delay status is applied. Specifically, in OpenSprinkler.cpp, find function:
inside the function, check the following two lines:
if (status.enabled && (!status.rain_delayed) && !(options[OPTION_USE_RAINSENSOR].value && status.rain_sensed))
bitvalue = station_bits[MAX_EXT_BOARDS-bid];
this is where rain_delayed and rain_sensed status get applied on station control bits. If you know which stations you’d like to ignore rain delay for, you can modify the code and hard-code the station indices to allow them to bypass rain delay status. Then recompile and flash the program to the controller. This solution is not very elegant, but it does achieve what you need with minimal impact on program and RAM size.