How do I update the configuration of a module?
As mentioned in the original question, and follow-up comments, there are a variety of contrib modules and manual methods to accomplish this.

To do it automatically, or in a custom fashion, I think hook_update_N() is still probably the most viable option.

For instance, this is an example from the Head 2 Head to update system.site to set the default_langcode:

  $config_factory = \Drupal::configFactory();
  $langcode = $config_factory-&gt;get('system.site')-&gt;get('langcode');
  $config_factory-&gt;getEditable('system.site')-&gt;set('default_langcode', $langcode)-&gt;save();


You can also read in config (recommended only for adding new config, not necessarily updating or overriding config that may have been customized):

  $source = new FileStorage($path);
  /** @var \Drupal\Core\Config\StorageInterface $active_storage */
  $active_storage = \Drupal::service('config.storage');
  $active_storage-&gt;write($name, $source-&gt;read($name));


where $path is the absolute path to the my_config.foo.yml file.