Adding ELSE argument to AJAX Live Search for “No results found”

Try to not using endif and endwhile, just use curly brakets {} to determinate ifs body or add :after elseelse:`

Your problem is that you mix two syntaxes.

Read this to fully understand how to write alternative syntax
https://www.php.net/manual/en/control-structures.alternative-syntax.php

    add_action('wp_ajax_data_fetch' , 'data_fetch');
    add_action('wp_ajax_nopriv_data_fetch', 'data_fetch');
    function data_fetch() {
    
        $post_search_query = new WP_Query(array('posts_per_page' => -1, 's' => esc_attr($_POST['search_keyword']), 'post_type' => 'post'));
    
            if ($post_search_query->have_posts()){
    
                while ($post_search_query->have_posts()){  $post_search_query->the_post(); ?>
    
            <h5><a href="<?php echo esc_url( post_permalink() ); ?>"><?php the_title();?></a></h5>
            <span class="live-search-post-excerpt"><?php the_excerpt(); ?></span>
    
        <?php } //end while
wp_reset_postdata();
} //end if
    
         
    
                else {
                
                    echo 'No results found';
            } // end else
        
    
    die();
    
    }