How can I incldue a “private” post type in a loop for public users?

Figured it out, it was simpler than I expected.

/**
 * Include catalog posts in archives, even though they're not "public"
 *
 * @param WP_Query $query
 * @return WP_Query
 */
function wpse415668_catalog_posts_in_archives(WP_Query $query): WP_Query {
    if (! $query->is_admin() && $query->is_main_query() && $query->is_tax("catalog_category")) {
        $query->set("post_type", "catalog");
    }

    return $query;
}
add_filter("pre_get_posts", "wpse415668_catalog_posts_in_archives");