OK, so a "for" loop can - only - ever be used to set up something that is essentially instantaneous and will not take any time other than the machine instructions themselves.
The whole point about this "doing many things at the same time" approach is never waiting for anything. So you cannot use a "for" loop in the code for anything that will take any time at all to perform.
You must "unravel" the "for" loop in two steps. The first is that the index of that loop is a "state variable" which is used in the piece of your code where the "for" loop was in exactly the same manner, but is only incremented when the second step is complete.
This second step is to see whether the action that was in the "for" loop has occurred or is completed. If it has not, then nothing happens, the loop variable is not advanced.
So in your code, you do not specify a duration in the tone() function. You re-write that function in the same way as the LED patterns, using millis() to determine when the tone has completed. You either go on to set the next tone of use noTone() for a pause.
OK, I think you have figured that out. Salient points - nothing in the code, including no function such as tone() with a duration, or delay() - that requires any time at all to perform. If you think something needs to take any time, then you need to figure out how to break it up.