чем это тогда упрощает процесс создания игрушки с нуля?
Смысл использования языка C для разработки игр для MD такой же как и смысл его существования. На C для MD можно писать не только с помощью SGDK, но SGDK включает много полезных функций и возможностей. В SGDK есть как "низкоуровневые" функции, так и "высокоуровневые", которые используют низкоуровневые и позволяют меньше тратить времени, но для продвинутой или специфичной игры придётся использовать низкоуровневые.
UPD: Кстати, в SGDK есть имитация консоли, но без printf. Есть отдельно похожие функции из библиотеки C такие как strlen(), strcmp() и sprintf(), которая заменяет printf(), например:
char str[16];
sprintf(str, "%u/%u", currentImageIndex + 1, (u16)ARRAY_SIZE(images));
VDP_drawTextEx(BG_B, str, TILE_ATTR(PAL1, 0, 0, 0), 2, 2, CPU);
для чего нужно "while(1)"?
Если это весь кусок, то только для отображения текста, нет смысла выходить из main(). Обычно в играх есть основной игровой цикл, для SGDK это выглядит как бесконечный цикл после инициализации, в котором ожидают VBlank через SYS_doVBlankProcess() (там происходит и доп. работа, в доках написано), туда ещё добавляют чтение ввода и остальную логику игры. Не обязательно делать один цикл и можно делать ожидание VBlank внутри этого цикла или можно в бесконечном цикле вызывать только функцию по указателю, который содержит разные функции во время игры, ожидающие VBlank сами. Возможно по аналогии с NES играми можно весь код засунуть в обработчик VBlank, тогда в main() будет просто бесконечный цикл.
Красивее делать while(true)
В случае с SGDK - while (TRUE). Мне ещё нравится for (;;) {}, а для непонятливых можно while ("the cartridge is inserted") {} - ром будет точно такой же как с while (TRUE) {}, я проверил, тривиальная оптимизация работает.