Как вывод в консоль дожидается выполнения async функции?
async func() всегда возвращает промис.
И в консоль выводится именно этот промис со статусом pending.
После завершения fetch и json статус промиса изменится на fulfilled и ему добавится значение.
Вот вывод консоли сразу после console.log:
Promise { <state>: "pending" }
Если через некоторое время раскрыть этот объект, то увидим, что его статус уже сменился (вы ведь помните, что в консоль выводится живой объект по ссылке):
Promise { <state>: "pending" }
​  <state>: "fulfilled"
​  <value>: Array(10) [ {…}, {…}, {…}, … ]
​  <prototype>: Promise.prototype { … }
Асинхроная функция всегда возвращает промис, вы своим console.log выводите отнюдь не результат, а тупо промис от функции. Далее, в консоли вполне можно запускать асинхронный код, попробуйте прямо сейчас вбить в консоли:
response = await (await fetch('https://jsonplaceholder.typicode.com/users')).json();
console.log(response);
Или же применительно к вашему коду делайте так:
async function func() {
  const response = await fetch('https://jsonplaceholder.typicode.com/users');
  return await response.json();
}
console.log(await func());