I took a closer look and it turns out that robot nodes have a synchronization field, which gurantees that world steps are paused until robot steps are executed. (this is also mentioned in Fabien's second answer in the original question)
If synchronization is TRUE (the default), the simulator will wait for the controller's wb_robot_step function call whenever necessary to keep the simulation and the controller synchronized. So for example if the simulation step (WorldInfo.basicTimeStep) is 16 ms and the control step is 64 ms, then Webots will always execute precisely 4 simulation steps during one control step. After the 4th simulation step, Webots will wait for the controller's next control step (call to wb_robot_step(64)).
https://cyberbotics.com/doc/reference/robot#synchronous-versus-asynchronous-controllers
I would assume for (time-intense) ML approaches or cloud execution, it would be best to have sync activated to avoid a run-away physic/world simulation step. If you want to train on varying reaction speeds for your robot, one would probably implement a random modulation (ms to a few seconds) of the robots' step count during run time to emulate the async setting. But correct me if there's a better approach.