Thanks to @Berdir and @4k4 who helped me out several times - I just followed their ideas, tested and wrote up the answers.
This first hook alters the field settings. I've included a second example for image settings.
function XXX_field_config_create(FieldConfigInterface $field) {
if ($field->isSyncing()) return;
switch ($field->getType()) {
case 'image':
$field->setSettings(['file_directory' => 'images', 'max_resolution' => '1080x1080']);
break;
case 'text_with_summary':
case 'text_long':
$field->setThirdPartySetting('allowed_formats', 'basic_html', 'basic_html');
break;
}
}
This second hook alters the form display settings. The array_diff_key command is used to determine which fields are new.
/**
* Implements hook_ENTITY_TYPE_presave().
*
* Override field form display defaults used when a field is added to a content type.
*/
function XXX_entity_form_display_presave(EntityFormDisplay $display) {
$fields = $display->getComponents();
$origFields = (isset($display->original)) ? $display->original->getComponents() : [];
foreach (array_diff_key($fields, $origFields) as $newField => $settings) {
switch ($settings['type']) {
case 'text_textarea_with_summary':
case 'text_textarea':
$settings['third_party_settings']['allowed_formats'] = ['hide_help' => '1', 'hide_guidelines' => '1'];
$display->setComponent($newField, $settings);
break;
}
}
}