How to avoid a duplicate query from using wp_nav_menu?

You’d avoid it by creating another menu and menu location. You can do this with a widget area or whatever. Then only call the menu if the page is the home page with is_home() or is_front_page() if it is a page.

Here’s from twenty seventeen as an example.

register_nav_menus(
    array(
        'top'    => __( 'Top Menu', 'twentyseventeen' ),
        'social' => __( 'Social Links Menu', 'twentyseventeen' ),
    )
);

and then it’s called like:

<?php if ( has_nav_menu( 'top' ) ) : ?>
    <div class="navigation-top">
        <div class="wrap">
            <?php get_template_part( 'template-parts/navigation/navigation', 'top' ); ?>
        </div>

You can pretty much put whatever you want in widget areas though. I use them just incase I wanna stick something else there.

In your situation, menu is the “correct” way to do it though.