How to programmatically replace a field label and content before rendering?
I expected to be able to do it with THEME_preprocess_field, but the
data at that point seems to have only the content's markup

There are more template variables:
field.html.twig:
{#
/**
 * @file
 * Default theme implementation for a field.
 * 
 * ...
 *
 * Available variables:
 * - attributes: HTML attributes for the containing element.
 * - label_hidden: Whether to show the field label or not.
 * - title_attributes: HTML attributes for the title.
 * - label: The label for the field.
 * - multiple: TRUE if a field can contain multiple items.
 * - items: List of all the field items. Each item contains:
 *   - attributes: List of HTML attributes for each item.
 *   - content: The field item's content.
 * - entity_type: The entity type to which the field belongs.
 * - field_name: The name of the field.
 * - field_type: The type of the field.
 * - label_display: The display settings for the label.
 *
 * @see template_preprocess_field()
 *
 * @ingroup themeable
 */
#}

So you can change for example label:
mytheme.theme:
/**
 * Implements hook_preprocess_HOOK() for field.html.twig.
 */
function mytheme_preprocess_field(&amp;$variables) {
  $variables['label'] = 'foo';
}