The filter you are using posts_where
affects the creation of SQL query, so by definition it is executed before query runs and you have any search results.
So you cannot loop through results at this point, what you can do is retrieve or hardcode list of unwanted items from elsewhere and use them to modify query.
Update
Ok, this is faster to code than trying to solve with comments. This is probably not perfect but should be good starting point for what you want:
add_action('pre_get_posts','exclude_pages');
function exclude_pages( $query ) {
if( !empty( $query->query_vars['s'] ) ) {
$pages = get_posts(array(
'post_type' => 'page',
'meta_query' => array( array(
'key' => '_wp_page_template',
'value' => 'landing.php',
)),
));
$exclude = array();
foreach( $pages as $page )
$exclude[] = $page->ID;
$query->set('post__not_in', $exclude);
}
}