An alternative to WordPress’s built-in menu functionality

As @chrisguitarguy said, you can likely fix this via your php.ini settings. Specifically, I’ve run into this issue with a client which was solved by setting max_input_vars to something like 2000.

In some cases though, menus can reach untenably large sizes and you may want a different way to manage them simply from a usability standpoint. For example, adding an item to a menu with hundreds of items can be a chore if you have to drag them up pages of scrolling. A potential solution in this case may be to break the menu into separate menus for each top level item, and then concatenate them into a single menu by removing the outer ul and combine them. The obvious drawback to this method is that the number and order of top level items is fixed, unless you provide some way to separately set and dynamically register your menus.

$menu_one = wp_nav_menu(
    array(
        'echo' => 0,
        'container' => false,
        'menu_class' => '',
        'menu_id' => '',
        'theme_location' => 'menu_one'
    )
);

$menu_two = wp_nav_menu(
    array(
        'echo' => 0,
        'container' => false,
        'menu_class' => '',
        'menu_id' => '',
        'theme_location' => 'menu_two'
    )
);

$menu_one = preg_replace( array( '#^<ul [^>]*>#', '#</ul>$#' ), '', $menu_one );
$menu_two = preg_replace( array( '#^<ul [^>]*>#', '#</ul>$#' ), '', $menu_two );

echo '<ul id="main-menu">' . $menu_one . $menu_two . '</ul>';