Right, you have a misunderstanding of what's happening.
Like you say, code will never continue after that await call for the reason you mention, but that doesn't matter.
When you call simple(), that method itself returns a promise - and you're not waiting on that promise. Your execution continues after calling simple() and instantly and hits the end of your program.
To go into more detail, nodejs will exit when there are no more callbacks to process. When you return your broken promise, you have not created a callback in the nodejs queue (like you would if you did a http request for instance). If you do something to keep nodejs alive, you'll see that done never gets executed.
const simple = async () => {
console.log('start')
await new Promise(resolve => {})
console.log('done.')
}
var promise = simple();
// keep the application alive forever to see what happens
function wait () {
setTimeout(wait, 1000);
};
wait();
If there is a pending callback (created by setTimeout, or from loading a resource, or waiting for an http response) then nodejs will not exit. However, in your first example, you don't create any callbacks - you just return a broken promise. Nodejs doesn't see anything "pending" there, so it exits.
Essentially at the end of your simple call, you have no more code to execute, and nothing pending (no waiting callbacks) so nodejs safely knows there is nothing else to be done.