to chain the b logs after the asynchronous execution of the called functions.

And it's the same for

console.log('0a', val);
first();
console.log('0b', val);

only that you cannot use await here since you are not inside an aync function. Making a function async doesn't mean that it magically blocks on everything asynchronous inside it, on the contrary - its result becomes a promise that is always asynchronous, and you can use the await keyword. So to make 0b wait, you can use either