Custom query with post_class filter using current_post not working

You are using the global $wp_query not your custom query. Either declare yours global too like global $wp_query_archives and then use that in the sm_inline_post_class callback while being aware of the drawbacks of using global variables or do a little work like so:

$class = sm_inline_post_class( array(), $my_custom_query );

And then pass $class as the first argument to your post_class call (I imagine you are using this function on your archive page).

Then, modify your sm_inline_post_class function like so:

function sm_inline_post_class( $classes, $query = null ) {
    global $wp_query;

    $query = ( $query == null ) ? $wp_query : $query;

    if( 0 == $query->current_post || 0 == $query->current_post % 3 ) {
         $classes[] = 'first';

    return $classes;
}

This however can always attach you ‘first’ if you are using your custom WP_Query nested in a $wp_query which happens to have the current_post set to a multiple of 3.

The even safer option would be to use a different function to get the class name:

$class = custom_inline_post_class( array(), $my_custom_query );

function custom_inline_post_class( $classes, $query ) {
    if( 0 == $query->current_post || 0 == $query->current_post % 3 ) {
         $classes[] = 'first';

    return $classes;
}