Assigning a meta_query value based on regexp to wp_query fails

Meta query should be an array of arrays (every array contains one condition).

So instead of

$meta_query = 
    array(
        'key' => 'offer',
        'value' => $off,
        'compare' => '='
    );
$query->set( 'meta_query', $meta_query );

There should be

$meta_query = array(
    array(
        'key' => 'offer',
        'value' => $off,
        'compare' => '='
    )
);
$query->set( 'meta_query', $meta_query );

PS. It would be a good idea to check if preg_match returns true – if there is no match, your code won’t make much sense, I guess 😉