Views Search Ignoring Custom Node Access permissions
It seems that a better way to control node access is through hook_node_access_records and hook_node_grants as described here http://drupal.org/node/1260948. This works with views properly.

I wrote this simple module based on the instructions in the link above:

define('MYMOD_REALM', 'mymod');
define('MYMOD_GRANT_ID_PUBLIC', 0);
define('MYMOD_GRANT_ID_MEMBER', 1);
define('MYMOD_GRANT_ID_BOARD', 2);
define('MYMOD_BOARD_MEMBER_RID', 7);
define('MYMOD_MEMBER_TID', 69);
define('MYMOD_BOARD_MEMBER_TID', 68);

/**
  * Implementation of hook_node_grants().
  */
function mymod_node_grants($account, $op) {

  if ($op == 'view') {
    $grants[MYMOD_REALM] = array( MYMOD_GRANT_ID_PUBLIC );
    if (array_key_exists(DRUPAL_AUTHENTICATED_RID, $account-&gt;roles)) {
      $grants[MYMOD_REALM][] = array( MYMOD_GRANT_ID_MEMBER );
    } 
    if (array_key_exists(MYMOD_BOARD_MEMBER_RID, $account-&gt;roles)) {
      $grants[MYMOD_REALM][] = array( MYMOD_GRANT_ID_BOARD );
    } 
    return $grants;
  }
}

/**
 * Implementation of hook_node_access_records().
 */
function mymod_node_access_records($node) {

  $grant = array(
      'realm' =&gt; MYMOD_REALM,
      'gid' =&gt; MYMOD_GRANT_ID_PUBLIC,
      'grant_view' =&gt; 1,
      'grant_update' =&gt; 0,
      'grant_delete' =&gt; 0,
      'priority' =&gt; 0,
    );
  if (in_array($node-&gt;type, array('page','publication'))){
    $access_level = field_get_items('node', $node, 'field_access_level');
    if (count($access_level)){
      $access_level = (int)$access_level[0]['tid'];

      switch ($access_level) {
        case MYMOD_BOARD_MEMBER_TID:
          $grant['gid'] = MYMOD_GRANT_ID_BOARD;
          break;
        case MYMOD_MEMBER_TID:
          $grant['gid'] = MYMOD_GRANT_ID_MEMBER;
          break;
      }
    }
  }
  $grants[] = $grant;

  return $grants;
}