I found it a lot easier to learn Win32 when I discovered that much of it was just MS' own styling and not actually necessary at all. A lot of the typedefs are artifacts from the Win16 days (e.g. you can just use a void* instead of LPVOID). This is a perfectly valid "Hello World" program, in a more traditional C style:
#include <windows.h>
#include <winuser.h>
int main() {
MessageBoxA(0, "Hello", "World", MB_OK);
}
Depending on if you specify /subsystem:windows or not in the linker settings, you can even get a console window (and thus printf() to it, etc.) and use it for logging etc. alongside the GUI, something that isn't often mentioned.
Another thing that probably drives people away is the insistence on starting with a "whole window" app, one that uses CreateWindow/RegisterClass, handles WM_PAINT, etc. when for a lot of purposes, a "modal dialog-based" app using a template and DialogBoxParam would be sufficient, and writing one of those is certainly easier. I've made a lot of trivial GUIs of the "window with a set of buttons to do various things" type with Win32, and it definitely doesn't take all that much work. Nothing more than two functions, one main() and one wndproc(), switch on the message/control in the wndproc() depending on which button was clicked, and do something accordingly.
I think it's a bit of a shame that the majority of the documentation on it is both overly complex and nonstandard in style, because the true "essence" of Win32 is really a small and simple C API. It's easy to create really small programs with it, and it doesn't take much code to do that either. When I learned WinSock I wrote a simple netcat-like GUI terminal emulator and it was <10KB.
Were early Windows systems stack constrained or something?
Win16, certainly. All apps ran in a segmented address space and the stack was usually in the 4-8KB range.