Find entries with multiple categories with an and/or twist
Ok, I was close :P

The trick is to create an object to pass instead of an array. The documentation for this is sketchy and confusing so I hope this snippet helps someone.

Notice I am setting 'and' at the root of the object, but this only applies to the objects that follow, not to targetElement arrays. So by separating all the features into separate objects, the 'and' is applied to them, but not the models.

{% set models = [24, 25, 26] %}
{% set features = [46, 47, 48] %}

{%
  set relatedTo = ['and', {
    targetElement: models,
    field: 'model'
  }]
%}

{% for feature in features %}
  {% set relatedTo = relatedTo|merge([{
    targetElement: feature,
    field: 'feature'
  }]) %}
{% endfor %}

{%
  set entries = craft.entries({
    relatedTo: relatedTo
  })
%}