Best way to create a search for custom post type by custom field values

Your basic query logic looks fine assuming you want an AND relationship between the first, middle, and last names but query_posts is never, ever, ever the right way to do anything.

Note: This function isn’t meant to be used by plugins or themes. As
explained later, there are better, more performant options to alter
the main query. query_posts() is overly simplistic and problematic way
to modify main query of a page by replacing it with new instance of
the query. It is inefficient (re-runs SQL queries) and will outright
fail in some circumstances (especially often when dealing with posts
pagination). Any modern WP code should use more reliable methods, like
making use of pre_get_posts hook, for this purpose.

Create a new WP_Query object and use that instead.

$args = array(
  // your arguments as above
);
$q = new WP_Query($args);
if ($q->have_posts()) {
  while ($q->have_posts()) {
    $q->the_post();
    the_title(); // etc.
  }
}