A lot of that bloat is due to compatibility and the 32bit -> 64bit transition.
Linux has suffered from the 32/64 bit problem as well for quite some time. The only difference is because of opensource it's been easier to slowly kill off the 32bit ecosystem.
First up, the nature of dlls is that the same dll for multiple applications gets saved in memory just once. If you have 2 windows applications and one is 32bit and the other 64bit, then both of those applications end up loading up effectively the same dlls, but one is compiled for 64bit apps and the other 32. That nearly doubles the amount of ram needed in a mixed system.
But then there's just the fact that 64bit code by it's nature uses and passes around 64bit pointers everywhere. That's not quite as significant but it does have an effect.
The other part that ends up adding to the memory consumption is from XP on microsoft added compatibility layers. What those effectively did is distribute a different set of dlls based on the application being launched. So now instead of having 1 copy of the dlls like you did with 95, 98 and ME you can end up with potentially 3 or 4 different dlls. And that's ultimately exploded as more versions of windows have been released.
Linux has suffered from the 32/64 bit problem as well for quite some time. The only difference is because of opensource it's been easier to slowly kill off the 32bit ecosystem.
That's not been an option for windows.