Call preprocess_node (or get variables) from Twig template?
You're pretty close. I think there are a couple of approaches to this. This is what I would do

preprocess the lessons entity reference field for the courses bundle, iterate through the values, check the access, set a variable with the access value for each item. Then in field--field-lessons.twig.html, render the field if the access value is true.

&lt;?php
//the name of your lessons entity reference field on courses
function THEME_preprocess_field__field_lessons(&amp;$variables) {

  if($variables['element']['#bundle'] == 'courses') {
    $account = \Drupal::currentUser();
    $ent_refs = $variables['element']['#items']-&gt;referencedEntities();

    foreach ($ent_refs as $key =&gt; $ent_ref) {
      $check = $ent_ref-&gt;access('view', $account);
      $variables['items'][$key]['my_access'] = FALSE;

      if ($check) {
        $variables['items'][$key]['my_access'] = TRUE;
      }
    }

  }
}


then in field--field-lessons.twig.html

...
{% for item in items %}
    {% if item.my_access == TRUE %}
      I'm Unlocked: {{ item.content }}
    {% else %}
      I'm locked :(
    {% endif %}
  {% endfor %}
...