We disallowed modifying the object in its draw function on purpose, because it is often a very bad design.
A cleaner design would be to react to the MouseMoved event in your event loop, and then check which buttons are highlighted and update their state from there.
Your other solution, calling an update function before drawing the button, is a typical one and is ok too.