Wait, I'm confused. That picture you posted shows exactly the icon I got with
INVOKE LoadIcon, NULL, IDI_WINLOGO
Not the "ugly grey default icon that dates back to MS-DOS times". I loaded no resources. Just the code I gave here.
I know it's confusing. There are two locations in a standard Windows program where to load icons:
A. in WinMain: mov wc.hIcon, rv(LoadIcon, ...
B. in the WM_PAINT handler: invoke DrawIcon, hdc, 10, 10, rv(LoadIcon, ...
The two locations behave differently. In WinMain, if you load an invalid icon, you get this:

This is the ugly default icon for executables, and it dates back to the 20th Century - see also below the AltTab screenshot.
If you load an invalid icon in the WM_PAINT handler, you just see
nothing.
If you use LoadIcon,
hInstance..., Windows checks in this instance, i.e. in the resources of this exe, for a matching ICON.
If you use LoadIcon,
NULL..., Windows checks elsewhere, and finds, in most cases, the crappy grey default icon.
I attach a testbed for playing, 48 lines only - the absolute minimum for a Windows program. Pure Masm32 SDK ;-)