Ok, for my own better understanding, I just did a test with one with statement that has two devices, which included a wait task and a task to change the devices. It did what one would hope/expect - i.e., it did the wait once, then did the action to all the devices.
So now I’m not sure I understand your original issue completely. I can definitely see that the three with statements would execute one after the other, where all the tasks in one with statement would have to complete before the next with statement (and its tasks) would start, and that was not what you were looking for. But I don’t understand where the 9 minutes came from, given the picture of the piston you originally posted. I can definitely see that changing the Heater (I believe this is really your thermostat???) would take 3 minutes, or maybe slightly more given turning off the switches in the list before it. But I can’t see 9 minutes.
But I think the bottom line is, now that you’ve set the with statements to asynchronous, they should all “effectively” start at the same time and it should do what you want.
Fair warning: this is where you can stop reading if you don’t care about the details! 
I say “effectively” in quotes because I believe in fact it doesn’t actually “run” all three with statements “at the same time.” It still can only do one thing at a time. But, the important point is, when it comes to a wait, it will temporarily postpone that statement (i.e., the with statement), and then go on to processing the following (with) statements. Then, when the wait completes, the piston will run again and pick up the asynchronous with statement after the wait and do the rest of its tasks.