create a page which displays a list of categories title+ short description?

You just need to add some conditional to aplly the filter or not. For example, if you don’t want to apply the trimming on category archive pages, one possible solution could be:

add_filter( 'category_description', 'cyb_trim_category_desc', 10, 2 );
function cyb_trim_category_desc( $desc, $cat_id ) {

    // Apply only if we are not in category archive template
    if( ! is_category() ) {

        // wp_trim_words( $text, $num_words = 55, $more = null );
        $desc = wp_trim_words( $desc, 55, '...<p class="wrap-more-link"><a class="more-link" href="' . get_category_link( $cat_id ) . '">' . __("Read more >>", "text-domain" ) . '</a></p>' );
    
     }

    return $desc;
}

Or, if you want to apply the trimming only to specific page template:

add_filter( 'category_description', 'cyb_trim_category_desc', 10, 2 );
function cyb_trim_category_desc( $desc, $cat_id ) {

    // Apply only if we the current page use my-page-template.php
    if( is_page_template( 'my-page-template.php' ) ) {

        // wp_trim_words( $text, $num_words = 55, $more = null );
        $desc = wp_trim_words( $desc, 55, '...<p class="wrap-more-link"><a class="more-link" href="' . get_category_link( $cat_id ) . '">' . __("Read more >>", "text-domain" ) . '</a></p>' );
    
     }

    return $desc;
}

You just need to define when you want to apply the trimming and apply the propper conditional.

A possible problem is that you are using category.php for the categories list. That template is intended to display a list of posts that belongs to some category and you should use it for that. You should build the categories list in another template file, maybe a custom page template, so you can use is_page_template() conditional just like the last example above.

UPDATE

As I said before, you should avoid the use of category.php template file to list your categories. category.php template file is intended to list posts that belongs to specific category and you may end up with problems because you are using it for other purpose.

For example, in the image you added to the question, I can see the class category-2 on body element. That means that WordPress made a query to get posts from category with ID = 2 but then, when category.php template is reached, you wasted that query and made another one to list the categories. That is wasting resources that cost money; additionally, you may end up with problems just like you are exprimenting. What happen if category with ID = 2 has not posts? What is the logic for that situation in your theme/plugins/WordPress core?

Instead, you should use a specific page template file to build the categories list. For example, you could create the template page-categories-list.php:

<?php
/**
 * Template Name: Categories list page
 */


 // Here the code to build the categories list

?>

Now, create a new page, select “Categories list page” template and instroduce the conditional in the filter for category description:

add_filter( 'category_description', 'cyb_trim_category_desc', 10, 2 );
function cyb_trim_category_desc( $desc, $cat_id ) {

    // Apply only if we the current page use my-page-template.php
    if( is_page_template( 'page-categories-list.php' ) ) {

        // wp_trim_words( $text, $num_words = 55, $more = null );
        $desc = wp_trim_words( $desc, 55, '...<p class="wrap-more-link"><a class="more-link" href="' . get_category_link( $cat_id ) . '">' . __("Read more >>", "text-domain" ) . '</a></p>' );
    
     }

    return $desc;
}

Now, you should have the categories page list with a description excerpt and categories archive with full description and without problems if the category has posts or not. And more importantly, without wasting the resources from quering posts that you are not going to use.