add_query_arg to compare and display events from a certain date

As you can see in your custom WP_Query, you pass hardcoded aguments, you are not evaluating the arguments passed in the URL, so they does not affect to the result.

In your case, it seems that using a custom query for the archive template is the bad way. When you request the archive template, the events for the archive have been already queried and you are refusing the results and making a new secondary query. Instead, you should use pre_get_posts action hook to alter the main query before it is executed, so you get the events you want in the archive template without the need of a secondary template.

add_action( 'pre_get_posts', function( $query) {

   if(isset($query->query_vars['action']) && $query->query_vars['action'] == 'search'){

       //Check that is the main query, not secondary, that we are not in admin side
       //and check that $query is the for the events archive

       if($query->is_main_query() && !is_admin() && is_post_type_archive('events') ) {

           //Get the values passed in the URL and pass them to the query
           if( ! empty( $_GET['meta_query'] ) ) {
               //You may need some validation/sanitization in $_GET['meta_query'] befor use it
               $query->set( 'meta_query', $_GET['meta_query'] );
           }


       }

   }


} );