Changing sort order with pre_get_posts using is_post_type_archive doesn’t change category pages

Since you need to target the post type archive page and taxonomy pages, you just need to extend your function to include the specific taxonomy archive pages. You can use is_tax() to target these taxonomy pages

You can try the following; (You can just modify is_tax() to target specific taxonomies or terms according to documentation)

add_action( 'pre_get_posts', 'cd_sort_staff' );
function cd_sort_staff( $query ) {
    if ( $query->is_main_query() && !is_admin() ) {
        if ( $query->is_tax() || $query->is_post_type_archive('staff') ) {
            $query->set('orderby', 'meta_value_num');  
            $query->set('meta_key', 'sort_order');  
            $query->set('order', 'ASC'); 
        }       
    }
}