I believe much of this was already in place with Windows 3.1(1)'s 386 enhanced mode and Win32s, although from memory Windows 95 moved far more device drivers into the 32-bit kernel. Presumably this was enabled by not having to be able to end the windowing session and quit back to DOS without rebooting.
[1] I seem to remember CD-ROM drive controller drivers being particularly common culprits in this regard, with virtual mode device drivers often being unavailable, so you had to use real mode drivers in config.sys even on Win9x. Yes, back in the day of single-, double-, and quad-speed CD-ROM drives, you typically had an ISA card with a custom controller that then connected to the CD-ROM drive via an "I can't believe it's not IDE" ribbon cable. Only later did we get ATAPI and hard drives and optical drives could use the same controller and bus. (Sound cards often had an on-board CD-ROM drive controller and ribbon cable connector around that time.)
The original "It's now safe to turn off your computer" screen after shutting down windows 95 is actually just a dos prompt.
You cannot see it, because the computer was left in a graphics mode, but if you can blindly type a command to switch graphics mode you're back at a normal DOS prompt.
In Win9x/Me, the core of the OS (the VMM) is 32-bit (which was true even in Windows 3.x in 386 Enhanced mode.) But, some other parts of the OS remained 16-bit code, and 32-bit apps will sometimes end up invoking 16-bit code via thunks when calling OS APIs.
By contrast, NT-based Windows, a 32-bit app will never invoke any 16-bit code. The only scenario in which 16-bit code would ever run would be when running a legacy 16-bit app.
(Someone please correct me if I'm remembering this wrong.)
However there were commonly used built-in dos utilities that were 16bit so if you called out to any of those then obviously you would invoke 16bit code.
By contrast, Windows NT doesn't support 32-bit processes loading 16-bit DLLs, although it does support the reverse (16-bit processes loading 32-bit DLLs – "general thunking")
http://rgmroman.narod.ru/flthunk.htm
I'm not sure how widely this facility, of loading 16-bit DLLs into 32-bit processes, was used. I thought, Microsoft actually used it internally in implementing parts of Win95, but I could be misremembering that.
IIRC it was more than just data structures and that other chunks of GDI were 16-bit, in part due to problems with 32-bit driver support for graphics hardware at the time.