Возможно, компилятор настолько умён, что просчитывает кое-что наперёд. В последнем примере он понимает, что напечатать нужно "0" и "1" и вызавает putchar('0') и putchar('1'). Эта ф-я должна быть короткой. В примере с циклами компилятор осознаёт, что первый цикл выполняется только раз и вызывает putchar('0'), а во втором, более длинном цикле вытягивает из библиотеки полный printf