А вы что хотели? Функция может быть вызвана с 2-мя параметрами или с 22-мя... А обработчику почем знать, сколько их? Вот и приходится стек равнять вызывающей программе.
Массив, может и ни причем, но тезис "обработчику почем знать" - конечно неверный, т.к. число передаваемых параметров должно соответствовать (по кр.мере быть не менее) числа спецификаторов формата в lpFmt. Поэтому после анализа "правильной" lpFmt функция wsprintf может "знать" сколько параметров было передано и в принципе могла бы удалить их из стека. Но микрософт видать решил c этим не связываться, т.к. и эпилог функции получается нестандартный и строка lpFmt м.б. с ошибками и число параметров может оказаться больше числа спецификаторов