Creating a custom field with dynamic/virtual computed property value
UDPATE

I think the new part of your configuration is not necessary. I recall that there is a module called entity_reference_uuid which does something like you want: extends from core ER field type, adds an extra column target_uuid and uses the entity property which is computed from the reference.

In their schema they only have these keys definition:


field.storage_settings.entity_reference_uuid
field.field_settings.entity_reference_uuid
field.value.entity_reference_uuid


If you look here you will see the entity is computed (like the one you want to add). Further down you can see they kept sync between the entity property during ::setValue  ::getValue methods and implement ::onChange to notify any changes on the property. This all are entity lifecycle logic, nothing to do with rendering.

Until here everything is more like your code.

Later on the formmatter they just iterate over the referenced entities which are obtained from the $items. The thing is I think that your problem comes from not implementing the \Drupal\Core\Field\Plugin\Field\FieldFormatter\EntityReferenceFormatterBase::prepareView:

/**
 * {@inheritdoc}
 *
 * Loads the entities referenced in that field across all the entities being
 * viewed.
 */
public function prepareView(array $entities_items) {
  ...
  // Fragment fromt line 142 and on.
  // For each item, pre-populate the loaded entity in $item-&gt;entity, and set
  // the 'loaded' flag.
  foreach ($entities_items as $items) {
    foreach ($items as $item) {
      if (isset($target_entities[$item-&gt;target_id])) {
        $item-&gt;entity = $target_entities[$item-&gt;target_id];
        $item-&gt;_loaded = TRUE;
      }
      elseif ($item-&gt;hasNewEntity()) {
        $item-&gt;_loaded = TRUE;
      }
    }
  }
}


As you can see there is where the entity key is populated for the formatter to use.



ORIGINAL ANSWER

By default all (most) pieces of data in Drupal 8 are typed data or get composed by it; means that fields are complex typed data which are like maps or mappings. EntityReferenceItem extends from \Drupal\Core\Field\FieldItemBase which extends from \Drupal\Core\TypedData\Plugin\DataType\Map. As explained in both of your renferences you should override the ::getValue method from EntityReferenceItem. Here is an example

/**
 * {@inheritdoc}
 */
public function getValue() {
  $values = parent::getValue();
  $values['computed_value'] = $this-&gt;myAwesomeService-&gt;getJSONApiData();      
  return $values;
}


There on your formatters (and view's field) can use the computed_value key from your field.