EntityFieldQuery with "NOT IN" FieldCondition and "=" FieldCondition on the same multi-value field is only processing one FieldCondition
This happens because EntityFieldQuery::addFieldCondition() is written like so:

protected function addFieldCondition(&amp;$conditions, $field, $column = NULL, $value = NULL, $operator = NULL, $delta_group = NULL, $language_group = NULL) {
  // The '!=' operator is deprecated in favour of the '&lt;&gt;' operator since the
  // latter is ANSI SQL compatible.
  if ($operator == '!=') {
    $operator = '&lt;&gt;';
  }
  if (is_scalar($field)) {
    $field_definition = field_info_field($field);
    if (empty($field_definition)) {
      throw new EntityFieldQueryException(t('Unknown field: @field_name', array('@field_name' =&gt; $field)));
    }
    $field = $field_definition;
  }
  // Ensure the same index is used for field conditions as for fields.
  $index = count($this-&gt;fields);
  $this-&gt;fields[$index] = $field;
  if (isset($column)) {
    $conditions[$index] = array(
      'field' =&gt; $field,
      'column' =&gt; $column,
      'value' =&gt; $value,
      'operator' =&gt; $operator,
      'delta_group' =&gt; $delta_group,
      'language_group' =&gt; $language_group,
    );
  }
  return $this;
}


Note that a field condition is stored as an array in the $conditions variable, indexed by a a value that represents the field. When you add a new fieldCondition on the same field, it just overwrites the array.

I don't know if this was intentionally designed this way, or if it's a bug... but the behaviour you are seeing is exactly what the code says it should do!