Change values of nested fields with entity_metadata_wrapper
Using what Clive mentioned and with the hint eikes provided, this seems to be a way to accomplish what I want:

$nid = 108501;
$node_wrapper = entity_metadata_wrapper('node', $nid);

for ($i = 0; $i &lt; count($node_wrapper-&gt;field_image-&gt;value()); $i++) {
  $node_wrapper-&gt;field_image[$i]-&gt;file-&gt;field_source-&gt;set('NEW SOURCE');
  $node_wrapper-&gt;field_image[$i]-&gt;file-&gt;field_license-&gt;set('NEW LICENSE');
  $node_wrapper-&gt;field_image[$i]-&gt;file-&gt;save();
}

// Just for dev: Check if the values have been saved
$node_wrapper = entity_metadata_wrapper('node', $nid);
dsm($node_wrapper-&gt;field_bild-&gt;value());


Erroneously I used the save() call on the whole node wrapper, but as files are their own entities, the call needs to be on the file, as eikes suggested.

Additionally, I noticed that calling $node_wrapper = entity_metadata_wrapper('node', $nid); after the above code doesn't reflect the changes (for checking). It seems I need to reload the entity first.

Thanks a lot to both of you!