making customizer sections sortable but items not getting sorted first time items are moved

I think what your issue may be is that you aren’t setting the priority of the sections after you manually change their order in the DOM, so once the controls UI reflows the manual change may be getting lost.

Your code can be simplified as well by not having to register hidden section or control. You can register just one setting that contains the theme mod and update it directly via the Customizer API without having to trigger a change on an input.

Here is the simplified JS code:

wp.customize.bind( 'ready', () => {
    const orderSetting = wp.customize( 'itpg_front_order' );
    const panel = wp.customize.panel( 'itpg_front_page' );

    panel.contentContainer.sortable({
        item: '.control-section',
        axis: 'y',
        stop: () => {
            // Get the sections in the new order.
            const newlySortedSections = [ ...panel.sections() ].sort( ( a, b ) => {
                return a.container.index() - b.container.index();
            } );

            // Persist the new order as part of the changeset (and trigger preview update).
            orderSetting.set(
                newlySortedSections.map( ( section ) => section.id ).join( ',' )
            );
        }
    });

    // When the order setting is updated, make sure the sections get the appropriate priorities.
    // By setting the priorities in this way, the setting can be updated programmatically and the UI will
    // update accordingly. This two-way data binding.
    orderSetting.bind( ( newOrder ) => {
        const newlyOrderedSections = newOrder.split( /,/ ).map( ( sectionId ) => wp.customize.section( sectionId ) );
        newlyOrderedSections.forEach( ( section, i ) => {
            section.priority( i );
        } );
    } );
} );

That JS code can be enqueued as follows, assuming stored in a customize-controls.js file in a plugin:

add_action(
    'customize_controls_enqueue_scripts',
    static function() {
        wp_enqueue_script(
            'itpg-customize-control-js',
            plugin_dir_url( __FILE__ ) . 'customize-controls.js',
            array( 'jquery-ui-sortable', 'customize-controls' ),
            false,
            true
        );
    }
);

And then here is the updated logic for registering the Customizer panel, sections, and setting:

add_action(
    'customize_register',
    static function ( WP_Customize_Manager $wp_customize ) {
        $panel = $wp_customize->add_panel(
            'itpg_front_page',
            array(
                'title'       => __( 'Front Page', 'it-photographer' ),
                'description' => __( 'Modules for the Static Front Page.<br/>Will work on Static Front page with Front Page Template set.', 'it-photographer' ),
                'priority'    => 30,
            )
        );

        $sections = array(
            'itpg_hero' => array(
                'title'       => __( 'Hero', 'it-photographer' ),
                'description' => '',
                'panel'       => 'itpg_front_page'
            ),

            'itpg_home_portfolio' => array(
                'title'       => __( 'Projects', 'it-photographer' ),
                'description' => __( 'Jetpack needs to be installed and Portfolios need to be activated for this section to work', 'it-photographer' ),
                'panel'       => 'itpg_front_page'
            ),

            'itpg_home_testimonial' => array(
                'title'       => __( 'Testimonials', 'it-photographer' ),
                'description' => __( 'Jetpack needs to be installed and Testimonials need to be activated for this section to work', 'it-photographer' ),
                'panel'       => 'itpg_front_page'
            ),

            'itpg_front_blog' => array(
                'title'       => __( 'From the Blog', 'it-photographer' ),
                'description' => '',
                'panel'       => 'itpg_front_page'
            ),

            'itpg_cat_tabs' => array(
                'title'       => __( 'Category Tabs', 'it-photographer' ),
                'description' => '',
                'panel'       => 'itpg_front_page'
            ),

            'itpg_counters' => array(
                'title'       => __( 'Counters', 'it-photographer' ),
                'description' => '',
                'panel'       => 'itpg_front_page'
            )
        );

        $theme_mod_id  = 'itpg_front_order';
        $section_order = get_theme_mod( $theme_mod_id, array_keys( $sections ) );

        foreach ( $sections as $section_id => $section ) {
            $section = $wp_customize->add_section(
                $section_id,
                array(
                    'title'       => $section['title'],
                    'description' => $section['description'],
                    'panel'       => $panel->id,

                    // Note the order here will change based on what was saved in the theme mod.
                    'priority'    => (int) array_search( $section_id, $section_order, true ),
                )
            );

            // Add control to each section just so that it is not hidden.
            // Actual controls would be registered here instead.
            $wp_customize->add_control(
                "{$section->id}-placeholder",
                [
                    'label'       => 'Placeholder',
                    'description' => 'This control is registered purely to make the section not be hidden.',
                    'type'        => 'text',
                    'section'     => $section->id,
                    'settings'    => [],
                ]
            );
        }

        // Register a setting for the theme mod which contains the section order.
        $wp_customize->add_setting(
            $theme_mod_id,
            array(
                'type'              => 'theme_mod',
                'default'           => $section_order,
                'sanitize_callback' => function ( $value) use ( $sections ) {
                    return array_intersect(
                        explode( ',', $value ),
                        array_keys( $sections )
                    );
                },
            )
        );
    }
);