Eager load a list of entries, then only the first asset, from the first block type
Additionally, it appears I cannot use the loop to save a variable to use outside of it


This is really a separate question. Answering it anyway: you need to give the variable some value before the loop, and then it works:

{% set img = null %} {# initial value #}

{% for block in entry.pageContent %}
  {% if block.type == 'images' %}
    {% if not img %}
      {% set img = block.images[0] ?? null %}
    {% endif %}
  {% endif %}
{% endfor %}

{# img will be the first image of first 'images' block, or null #}