l'errore sta nel fatto che se la luce è accesa, tu controlli solo il tempo
case STATE_ON:
if(nowHourMinute > END_TIME) {
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
digitalWrite(lightRelay, LOW);
digitalWrite(fanRelay, LOW);
lcd.setCursor(0,3);
FanState = STATE_OFF;
lcd.print(" ");
lightState = STATE_OFF;
per cui se durante l'accensione della lampada, il loop legge l'umidità e compie l'operazione che vuoi tu
if (h1<45){
digitalWrite(fanRelay, LOW);
Serial.println("");
Serial.println("Fan Off");
FanState = STATE_OFF;
lcd.setCursor(10,3);
lcd.print(" ");
una soluzione potrebbe essere fare una procedura AttivaUscite(luce, ventilatore) i cui parametri li cambi nel loop, poi la richiami solo alla fine... oppure mettere il controllo che spegne la ventola all'interno del case "STATE_OFF", che è ancora più semplice