Почему выводится 12?
Потому что цикл хоть и пустой, но будет крутиться пока выполняется условие. А оно перестаёт выполняться когда b = 12.
В первом случае вы отслеживаете все итерации, которые подошли по условию выполнения цикла (b<12)
b=10, b=10+1, b=10+1
Во втором случае вы отслеживаете результат последней итерации (из-за которой цикл завершился)
b=10+1+1 

-Первый круг: цикл сперва берёт b=10 , сравнивает с условием b<12, затем выполняет инструкцию в фигурных скобках, и после этого делает b++
-Второй круг: цикл берёт уже b=11, сравнивает с условием b<12, затем выполняет инструкцию в фигурных скобках, и после этого снова делает b++
-Третий круг: цикл берёт b=12, сравнивает с условием b<12, и понимает, что пора закончить работу.

Это работает,как бесконечный вложенный if(){}
let b=10;
if(b<12){
   console.log(b);
   b++;
   if(b<12){
      console.log(b);
      b++;
      if(b<12){
         console.log(b);
         b++;
         if... // и так далее
      }
   }
}