How should I go about refactoring this so Vehicle is more than just a bag of 100+ properties that keeps growing.
You have masterfully concealed the information needed to answer that question behind this phrase:
// do work with vehicle
Everything else is noise. From a refactoring point of view I don't care about update() because the observer pattern exists. Or about tracking previous state because the memento pattern exists. These give us the freedom to restructure Vehicle however we like so knowing we need these doesn't tell us how to refactor at all.
Refactor Vehicle so it's easy to work with Vehicle. Whatever that means. Stop worrying about this other stuff. It's not helping. Add it later, after you've figured out the abstractions your using code needs.
That may sound like an unsatisfying answer. Especially if you're the type that likes to design Vehicle from the inside. I was like that when I started. Spent all my time thinking about what Vehicle is and tried to capture everything it was.
Today I don't do that at all. Instead I think about what the using code needs Vehicle to have. If that means I fail to model the glove box so be it. If nothing needs it, who cares?
George Box explained this beautifully when he said, "all models are wrong, some are useful". If you did all the work that it would take to stop your model of vehicle from being wrong it wouldn't be a model anymore. It'd be the real thing.
This is you why you skipping over describing the work with the vehicle is so devastating to me. I really don't care that it is a vehicle. I care about what needs it solves. That tells me what's really required.