How to deal with Bubbleable Metadata when there's no rendering context and no render array
Yes, when rendering email data you have to take care that you don't bubble up metadata to the render context of the main response.

There is a third option, and in most cases the best option: The method Renderer::renderPlain, which not only discards bubbleable metadata, but also makes sure your email doesn't contain leftover placeholders:


  Renders final HTML in situations where no assets are needed.
  
  Calls ::render() in such a way that placeholders are replaced.
  
  Useful for instance when rendering the values of tokens or emails,
  which need a render array being turned into a string, but do not need
  any of the bubbleable metadata (the attached assets and cache tags).
  
  Some of these are a relatively common use case and happen within a
  ::renderRoot() call, but that is generally highly problematic (and
  hence an exception is thrown when a ::renderRoot() call happens within
  another ::renderRoot() call). However, in this case, we only care
  about the output, not about the bubbling. Hence this uses a separate
  render context, to not affect the parent ::renderRoot() call.
  
  (Can be executed within another render context: it runs in isolation.)


And it's always a good idea to build a render array to produce HTML. For example if you have a formatted text field then build a processed text render element: How to safely render node body on a custom variable?