Is there another way to customize a parent template file besides adding the file to a child theme?

Is there a better way to customize a parent template file than to copy
it into the child theme and make changes?

Not really. Some themes, like Genesis, are specifically designed for child theming, and instead of templates use action hooks to construct their pages. If the parent theme is built like this you can use remove_action() and add_action() to modify templates. However, this is something that the parent theme needs to be specifically designed to support. It’s not applicable to most themes, and any implementation of this technique would be specific to the parent theme.

All I can suggest is to consult any documentation for the parent theme to see if they support any alternative methods for child themes.

Is this actually a problem with a poorly structured theme? That is, should the theme writer have kept the function definition in the parent theme, taking account of possible child themes in use?

When a developer creates a theme, they are also creating an API for child theme developers, whether they wanted to or not. APIs need to be stable. For the same reason WordPress can’t just remove functions without some kind of fallback to prevent errors, theme developers shouldn’t update their theme without consideration for child theme developers. So yes, I would argue that the theme developer should have kept the function definition.

The issue is that there’s no way to enforce this. However, there’s a couple of things you can do avoid this happening in the future.

  1. When using a child theme, don’t update the parent theme without reviewing the changelog, or changes themselves, for potential issues.
  2. Code defensively. For example, whenever you use a function from a 3rd-party plugin or parent theme, check function_exists() first. If the parent theme removes a function then the output would disappear, but at least there’s no fatal error.