I found the underlying root cause! See SIP never invalidates the Python wrapper for wxMenuItem/wxSizerItem/wxToolBarToolBase instances (use-after-free) · Issue #2931 · wxWidgets/Phoenix · GitHub
I believe that the issue cannot be fully resolved in the wxPython/sip layer and we need a little bit of upstream support from wxWidgtes to resolve it comprehensively in a fundamental way. See Proposal: make wxSizerItem, wxMenuItemBase, wxToolBarToolBase inherit wxTrackable, to let bindings detect their destruction