wp_nav_menu removing containing UL with ‘items_wrap’ => ‘%3$s’ not working

Yes, using WordPress 6.0.1 makes a difference. See this thread on wordpress.org/support. I believe since WordPress 5.9 a single database entry in the wp_posts table using the wp_navigation post_type is used to store the complete configuration for a menu. Prior versions used several wp_menu_item wp_posts entries with menu walkers to construct menus.

With WordPress 6 you can use the admin interface to visually build the menu. If you must do it programmatically, you could try using $wpdb with a SQL query to read the menu configurations from the wp_posts table, parse them with the parse_blocks() function, then reassemble them as desired by manipulating PHP arrays.

For example, an excerpt from the menu configuration stored in the database can look like this (post_content field of a wp_navigation post_type):

<!-- wp:navigation-submenu {"label":"Administration","type":"category","id":207,"url":"https://example.com/?cat=207","kind":"taxonomy","isTopLevelItem":true} -->
<!-- wp:navigation-link {"label":"Business","type":"category","id":311,"url":"https://example.com/?cat=311","kind":"taxonomy","isTopLevelLink":false} /-->
<!-- /wp:navigation-submenu -->
...

A SQL query like this can extract the configuration:

$nav = $wpdb->get_var(
    $wpdb->prepare(
        "SELECT post_content from $wpdb->posts where post_type="wp_navigation" and post_title = %s",
        $navigation_menu_name
    )
);

You would then get the blocks used to construct the menu with:

$blocks = parse_blocks( $nav );

An excerpt of the print_r( $blocks, true ); dump of the return value from parse_blocks() can look something like this:

Array
(
    [0] => Array
        (
            [blockName] => core/navigation-submenu
            [attrs] => Array
                (
                    [label] => Administration
                    [type] => category
                    [id] => 207
                    [url] => https://example.com/?cat=207
                    [kind] => taxonomy
                    [isTopLevelItem] => 1
                )

            [innerBlocks] => Array
                (
                    [0] => Array
                        (
                            [blockName] => core/navigation-link
                            [attrs] => Array
                                (
                                    [label] => Business
                                    [type] => category
                                    [id] => 311
                                    [url] => https://example.com/?cat=311
                                    [kind] => taxonomy
                                    [isTopLevelLink] => 
                                )

                            [innerBlocks] => Array
                                (
                                )

                            [innerHTML] => 
                            [innerContent] => Array
                                (
                                )
                            ...

The above array dump has “Business” as a sub-menu item of the parent “Administration”.

For one of my projects, I took the array, encoded it into JSON, and used it in client-side JavaScript to build a custom navigation menu using a JavaScript UI library. In your case, if you wanted to use WordPress native menu rendering, you could try combining the blocks array of two menus using PHP array functions, converting the combined arrays back into their original form as structured HTML comments/JSON using the serialize_blocks(); function, then inserting the result of serialize_blocks( $combined_blocks ) back into the wp_posts table by updating the desired navigation menu (e.g. SELECT navigation configurations from nav1 and nav2, then UPDATE the post_content field of nav3 where nav3 is the one chosen for display on the front end).