Yes, I've done this before to add an option to a menu.
Now, there are two ways to do this, method 1 will only work for a specific OS (well, it will work unless they changed the menu), while method 2 will always work. I'm only going to talk about method 1 though because looking at my code, you don't want to do method 2.
The first thing you have to do is find the actual data for the menu you want to replace. To do this, set a menu hook that returns zero, set a breakpoint on the menu hook, and then open the menu you want to replace. Skip the first call (A = 4) and on the second call (A = 0) follow the function when it returns. It's going to "un-bcall" a few times but eventually you'll end up back where the hook was called. When it does
LD A, ($85DE), you'll know that you're back. Take note of A because it's the value for the current menu. It's then going to do a little math and
load HL with the value pointed to by HL. When it does this, HL is now pointing to the data for the menu.
Look at
wikiti to see how the data is represented and then copy down everything for the menu (make sure you're still on the right flash page). (If there are 2 submenus, it's going to be the initial size byte, and then two of those data structures). Once you have the menu data, you need to figure out which item it is that you want to remove (you can probably just count). Remove those two bytes and readjust the size byte of that menu subgroup. This is now the actual menu you want to display.
To actually replace the menu. Make a menu hook and returns zero unless ($85DE) (it's called menuCurrent btw) equals the A value from before. (You can also look these values up by doing a ctrl + F "menuCurrent" on
this page) The hook also needs to return zero if it's been called for any event besides A = 0. At this point, you need to have the menu data in ram. Just point HL to the menu data and return nz. The OS will handle the rest from here