If I follow through your logic, your code behaves as expected.
To clarify, let's keep track of a pseudo game time: 0 seconds (gt 0s) and indent the steps
1) Sprite at 0,50 is created (gt 0s)
2) Wait 2 seconds (gt 0s)
3) Call function (gt 2s)
4) Create object at 50,50 (gt 2s)
5) Wait 2 seconds (gt 2s)
6) Create object at 100,50 (gt 4s)
7) Wait 2 seconds (gt 2s)
8) Create object at 150,50 (gt 2s)
9) Wait 2 seconds (gt 2s)
10) Create object at 200,50 (gt 4s)
Now let's check which objects get created at which "game time".
gt 0s: object at 0,50
gt 2s: object at 50,50 , object at 150,50
gt 4s: object at 100,50 , object at 200,50
Also ction 8) is fired immediately when the function is called.
Construct runs the events sequentially through each event branch. As dop200 indicated, since 8) is not a sub-event and therefore will get fired right away, not caring about the wait in the action block above it.