How to order posts on each different category?

First of all, you should not use custom query just to change the order of posts. This may cause problems with pagination and definitely is not optimal.

So first things first. Remove that part of your code:

        global $wp_query;
        $args =  array(
            'meta_key' => 'publish_date',
            'orderby' => 'meta_value',
            'order' => 'DESC'
        );
        $args = array_merge( $wp_query->query, $args );
        query_posts( $args );

All it does is changing few params and calling the query again. But there is an action, that allows you to add your custom parameters before running the query: pre_get_posts. And you can use it to modify order on category archives too:

function my_set_custom_order( $query ) {
    if ( ! is_admin() && $query->is_main_query() ) {  // modify only main query on front-end
        if ( is_home() ) {
            $query->set( 'meta_key', 'publish_date' );
            $query->set( 'orderby', 'meta_value' );
            $query->set( 'order', 'DESC' );
        }
        if ( is_category( 'cats' ) ) {
            $query->set( 'meta_key', 'cat_name' );
            $query->set( 'orderby', 'meta_value' );
            $query->set( 'order', 'ASC' );                
        }
        // ...
    }
}
add_action( 'pre_get_posts', 'my_set_custom_order' );

This will sort your homepage DESC by publish_date and your cats category ASC by cat_name.

You can add whatever you want/need in there and you can use Conditional Tags to modify queries only for some requests.