Update:
All above displayed only 'bread' instead of actual category ('bread', 'cake', or 'brownie') where each item belonged. So I assumed this should be something internal of wordpress about shortcode displaying in query loop.
Anyway, I tried another way not using shortcode and this time it works:
function filter_archive_categories( $terms, $post_id, $taxonomy ) {
    if ( $taxonomy !== 'category' || ( ! is_archive() && ! is_home() && ! is_front_page() && ! is_search() ) ) {
        return $terms;
    }
    $allowed_category_slugs = array( 'bread', 'cake', 'brownie' );
    $filtered_terms = array();
    if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) {
        foreach ( $terms as $term ) {
            if ( in_array( $term->slug, $allowed_category_slugs, true ) ) {
                $filtered_terms[] = $term;
            }
        }
    }
    return $filtered_terms;
}
add_filter( 'get_the_terms', 'filter_archive_categories', 10, 3 );
This time the result displays correctly. Thanks everyone so far. Hope this helps for those who may have the same problem.