The mental model that made this click for me: think of the thread as a single worker and each function as a task on a list.
A blocking call is the worker standing at the printer waiting for it to finish. Nothing else on the list progresses.
An await is the worker starting the printer, writing "come back to this when the printer beeps" on the task, putting it aside and picking up the next item. The task is paused; the worker never was.
The reason this matters more in JavaScript than in some other environments is that there is only ever one worker. A language with a thread per request can afford blocking calls, because blocking one thread leaves the others running. With one thread, blocking is total — which is why the language went to the trouble of building syntax that makes non-blocking code look ordinary.