Объясните, почему не срабатывает await?
Потому что await работает только с Promise-like объектами, то есть объектами имеющими метод then()
Под капотом await работает примерно следующим образом:// пусть value - результат операции справа от await
// resolve - функция, которая получает 1 аргумент, который вернет await
// (но не раньше выполнения микротасков event loop)
// reject - функция, которая получает 1 аргумент, который пробросит исключение в await
// (но не раньше выполнения микротасков event loop)
if(value && typeof value.then === 'function') {
  value.then(resolve, reject);
} else {
  resolve(value);
}
Про event loop, а так же что в нем микротаски - гуглите. Скажу лишь одно, микротаски выполняются на каждой итерации event loop притом все сразу, пока не закончатся.
console.log синхронный, оборачивание его в await не даст результата, кроме разве что следующее действие (которого в примере нет) будет выполнено в следующем микротаске, но по сути сразу же
setTimeout - асинхронный, но на колбэках, необходимо либо обернуть его в Promise либо в Promise-like объект.
Вариант с Promise:async function my_function() {
  console.log('1');
  await new Promise(resolve => setTimeout(resolve, 1000));
  console.log('2');
  console.log('3');
}
Вариант с Promise-like:async function my_function() {
  console.log('1');
  await {then(resolve) { setTimeout(resolve, 1000); }};
  console.log('2');
  console.log('3');
}
Потому что setTimeout и console.log не асинхронные. Вернее, setTimeout - асинхронный, но не через механизм async/await (сахар для Promise), а через колбэк, передающийся первым параметром (потому чтобы использовать его через await - нужно будет завернуть его в функцию, возвращающую promise)