Here I am again, replying to my own post but have new material too.
I found a way to bypass the restart. Given that I wasn't able to get _menu_insert() to insert a new top level menu item into the (main) MDI menu, I was surprised to find more recently that _menu_set() does produce a menu update without the need to restart SlickEdit. And to give credit, how to do this is more or less detailed in one or more SlickEdit Help examples. My working code is:
  def_mdi_menu = 'my_mdi_menu';
  int index = find_index (def_mdi_menu, oi2type(OI_MENU));
  int menu_handle = _menu_load (index);
  int old_menu_handle = _mdi.p_menu_handle;
  _mdi._menu_set (menu_handle);
  if (old_menu_handle) {
    _menu_destroy (old_menu_handle); /* or should that be _mdi._menu_destroy, I wonder? */
  }
As it should be. But where do I get my menu content? I copy the _mdi_menu resource text from macros/sysobjs.e and insert into it, at the right point, the text block of my new menu item. A little more magic and - voila! Now, even without restarting.
BUT, BUT, enter the SlickEdit v13 beta. NO SYSOBJS.E! Yes, sysobjs.ex, but no text ... no my_mdi_menu. The sysobjs.e omission may be intentional and may even be a good idea but it forced upon me an even greater task. I now also include logic to traverse the MDI menu using _menu_get_state(), essentially reverse-engineering the whole thing. I'm now trying to free myself of a remaining bug.
I realize that I'm apt to be blown out of the water here but my question is this: Wouldn't it be reasonable to alter _menu_insert() so that a poor sod like myself can execute the simple task of inserting a new top-level menu into the main MDI menu in a way that is, well, simple?