How should I read values from multi-field's subfield?
field_get_items() is the only function provided by core to help with this.

The Entity module provides the EntityMetadataWrapper class, though, which makes these things a bit more palatable. E.g.

$node_wrapper = entity_metadata_wrapper('node', $node);
try {
  foreach ($node-&gt;field_my_field as $item) {
    $val = $item-&gt;value-&gt;value();
  }
}
catch (\EntityMetadataWrapperException $e) {
  // Recover...
}


That's about the simplest example there is, it would be worth reading the docs to find out how else you can use it.