One idea would be to create custom output functions and distribute them via a package. Then when a user wants to create a report using that template, they could specify that output format function in the YAML header.
As a hypothetical example, if you created a package called rmdTemplates that contained the custom output format function customTemplate(), then a user could use that template by installing rmdTemplates and specifying the following YAML header:
---
output: rmdTemplates::customTemplate
---
Using this strategy, all the assets can be defined once inside the package. Then the related templates can either separately import these asset files, or they could extend each other (e.g. a base format baseTemplate() could import all the shared assets, and then the various other templates would extend baseTemplate()).