На самом деле нужно взглянуть на это дело более широко.
Windows API — интерфейс, посредством которого приложения получают доступ к системным функциям среды. Интерфейс этот "бинарный", то есть, он определяется на уровне таких "низменных" материй, как порядок передачи параметров через стек, размер этих параметров, используемый способ выравнивания структур и т. п.
Язык Си, который "от рождения" являлся довольно низкоуровневым, хорошо справляется с определением таких интерфейсов. Для этого достаточно определить ряд соглашений, связанных с платформой (ну, например, наличие поддержки способа вызова __pascal или наличие двухбайтного целочисленного типа).
Однако он является не единственным потенциальным языком написания приложений.
Например, мы могли бы писать прикладное ПО на Паскале, Модуле, Бейсике, Аде или Фортране. Могли бы изобрести собственный язык программирования.
У разных языков программирования — разные системы типов, поэтому основываться на системе типов языка Си было бы неверно. С другой стороны, нужна определенная минимальная унификация типов данных, иначе не от чего оттолкнуться в построении низкоуровневого интерфейса.
Естественно определить некий набор примитивных типов, соответствующих нуждам, основываясь на специфике платформы. Например, для Win16 мы имели INT, UINT, LONG, ULONG, WORD, DWORD, BYTE и т. п. Типы языка Си (int, long и т. п.) изначально в программном интерфейсе Windows не использовались вовсе.
Для описания специального предназначения определенных данных нужен тип BOOL. Он также должен быть примитивным типом. То есть невозможно определить его как-то более подробно, чем некий аппаратный тип; на роль такого аппаратного типа лучше всех подходит INT по причинам, которые здесь уже приводились.