I too have been looking for a clean way to do this and haven't found one yet. I have found a bit of a hack though that others might be interested in...
The key to the hack is the xbootmgr tool from Microsoft. This tool is designed primarily for developers to gather timing information to figure out what's slowing down booting. As an added bonus, it wires the system up to automatically reboot once you hibernate. The tool is part of the Windows Performance Tools which you install via the Windows SDK. At least on my system, it takes the system about a minute to wake back up from the suspend state, which is a little annoying, but it works. YMMV.
As others have mentioned, don't try to mount your NTFS R/W in linux once hibernated.
My experience is with UEFI based booting. This theoretically should work with MBR/BIOS based bootloaders, but you'll have to use GRUB or some other non-windows bootloader in the MBR to avoid the "auto resume" feature of that bootloader (whenever it detects a hibernated system it ignores any other boot options you may have added for Linux.) If you go the grub/MBR route, take a look at the grub-reboot command to pop over to Windows for one boot cycle.
UEFI With Windows Primary
If you spend most of your time in Windows and have it set as your default boot option, you'll need a tool on the windows side to toggle your Linux install to "boot once" - something like EasyUEFI. When you want to hibernate and reboot to Linux you'll toggle it to boot once.
After toggling the boot-once flag, then as admin, run:
xbootmgr -trace hibernate
If you wired it up correctly, you should wind up in your Linux environment exactly one time, and once you reboot again, you'll find yourself back in windows, resumed from your prior hibernated state.
UEFI With Linux Primary
If you spend most of your time in Linux and have it wired up as your primary boot option, you can skip the UEFI tool on the windows side described above. You'll instead use something like efibootmgr. First you need to figure out which boot entry maps to windows. Just run
And you'll see something like this:
Timeout: 1 seconds
Boot0001* Windows Boot Manager
Then to set Windows to boot once, you'd use the number that matches up (0001 in my example) with:
sudo efibootmgr --bootnext 0001
Then go ahead and hibernate/reboot from Linux, and you'll land in windows once, and when you're ready to go back to Linux, run xbootmgr on the windows side to hibernate there and you can happily toggle back and forth between the two.