It is my recollection as well. Most applications used VB, Delphi, MFC etc. that all had the "native" OS look and feel. There were some exceptions like WinAmp and others, but from what I can remember most applications were more consistent than today.
Those toolkits would usually reimplement the "native" look and feel from scratch, or nearly so. It was uncommon to rely directly on the basic OS widgets.
MFC was Microsoft, so that was definitely native, and I think a lot of stuff used native even just for performance reasons. I remember getting very frustrated around then when something would want me to install the JVM and I knew I was in for a laggy mess of an application that would have bad font rendering, strange little buttons, and its own file picker.
Don't modern versions of Windows contain at least 5 different widget frameworks? Like, Win32, Ribbon (I think engineered for Office as you said), WinForms, WPF, WinUI 1/2/3... I think Apple just has Cocoa (Carbon is long gone), AppKit, UIKit, and SwiftUI.
MFC is a thin wrapper around Win32. Delphi's VCL is a much thicker wrapper but still using (mostly) native widgets; ditto for VB6.
So, no, it was quite the opposite - it was uncommon to not rely directly on the basic OS widgets. Off the top of my head, the two toolkits that I remember that didn't do that were Borland's OWL (which quickly died out in post-Win16 era, since Delphi/VCL was strictly better), and Qt, which while not using native widgets tried to approximate that look and feel as much as possible.
Even in Java land, their first take - AWT - wrapped native widgets. It wasn't until Swing that they moved on to rendering their own, and it was widely derided as looking inconsistent with other apps as a result of that.