I think if you separate the business of receiving commands from the business of responding to the commands it will make it much easier to sort out your problems. I would aim to reduce loop() to something like this
void loop() {
receiveCommand();
interpretCommand();
switchLeds();
}
The receiveCommand() function would read in data until a ':' is received and save it somewhere together with a marker to say a new command has been received.
The interpretCommand() function would see that a new command was received and would figure out and save the new Led on/off situation. It would also update the marker to say the command had been dealt with.
The switchLeds() function would switch all the leds according to the current settings.
There should be ample time to do all this.
...R