Okay, I figured it out. The problem is that you spawn a new menu and update that's list, but the original menu has an un-updated list (which is why the monster comes back when you cancel, because you destroy the new menu with the updated list and go back to the old menu)
Also good point re: array_delete, we can just delete the entire entry from the array to get around the whole mess with manually sorting it.
Try this code:
function mev_pause_monsters_release_confirm(){ daddy = other.id message_spawn(tsprintf("You released %.",amp_get_monster_name(my_monster))) array_delete(global.active_monster_party,my_monster,1) array_insert(global.active_monster_party,AMP_FIRST_ACTIVE + PARTYSIZE_ACTIVE - 1,[]) amp_clear_monster(AMP_FIRST_ACTIVE + PARTYSIZE_ACTIVE - 1) with(daddy.daddy){ msh_spawn_monster_list(mev_pause_monsters) } instance_destroy(daddy) instance_destroy() }