Yes they run synchronously. But you are ignoring the fact work can be threaded. This would mean that work is still being done, even though the call returns. As an example, look at Package Control. When you select an action, say "Install Package", you regain control immediately. However, the command is still doing work (getting the list of packages). I would assume build systems do something similar. I believe the build system runs through a command listed in "Default/exec.py" if you want to look closer.
If you would like a more concrete example, create a simple plugin that simply sleeps for a while, then prints something to the console. Notice that this locks ST. Now, move that logic so it runs in a separate thread. Notice in this scenario you regain control of the ST, even though the "action" hasn't completed.