How to apply comma separation,strip_tags and orderby to wp_get_object_terms

For the sake of performance, you should rather use get_the_terms() to get the post terms and then use usort to sort the results. wp_get_object_terms() are not cached and therefor requires an extra db call per post queried.

While at it, also, you would want to pass the complete term object to get_term_link(). If the term is not cached, and the slug or ID is passed to get_term_link(), get_term_link() will query the db to get the complete term object, which you already have. Passing the complete term object saves unnecessary db calls or having to look in the term cache for the term object.

Lastly, you should always define $args first before using it. In your original code, you are trying to use $args first, and then define it, this was the main issue for your failure.

Anyways, you can use the following idea to sort your post terms

$product_terms = get_the_terms( get_the_ID(), 'school-year-level' );

// Make sure we have terms and also check for WP_Error object
if (    $product_terms
     && !is_wp_error( $product_terms )
) {
    @usort( $product_terms, function ( $a, $b )
    {
        return strcasecmp( 
            $a->slug,
            $b->slug
        );
    });

    // Display your terms as normal
    $term_list = [];
    foreach ( $product_terms as $term ) 
        $term_list[] = esc_html( $term->name );

    echo implode( ', ', $term_list );
}

EDIT

To make clicable links that link back to the term’s archive page, you need to replace

$term_list[] = esc_html( $term->name );

with

$term_list[] = '<a href="' . get_term_link( $term ) . '">' . esc_html( $term->name ) . '</a>';

Note, if you pass the complete term object to get_term_link(), you do not need to pass the taxonomy. The taxonomy is gathered from the term object.