I've had another look at this and managed to get gdb working enough to step through the source code.
It looks like raw_co_create(BlockdevCreateOptions *options, Error **errp) in block\file-win32.c *always* calls set_sparse (which calls Win32's underlying DeviceIoControl/FSCTL_SET_SPARSE). file-posix.c has some options for "preallocation" and only creates sparse files when asked, but these aren't supported for a Windows host in the code right now.
I'm not quite at the point where I could create a patch, but with some help I could get it done.
--Adam