I ended up using something similar to what is described here: Run Template in Template (recursion) within underscore.js template engine but I am using CoffeeScript so it is slightly different:
The view:
# foo.js.coffee
class MyApp.Views.Foo extends Backbone.View
template: JST['foo']
inititalize: ->
#init stuff
render: =>
templateFn = @template
$(@el).html(@template(model: @model, templateFn: templateFn))
@
The @model
will have children inside that share the structure of their parent.
The template:
# foo.jst.eco
<%# other output stuff here %>
<%# there is a 'components' attribute that contains the children %>
<% if @model.get('components') : %>
<%# recursive output of components %>
<% for e in @model.get('components') : %>
<% foo = new MyApp.Models.Foo() %>
<% foo.set(e) %>
<%# note the - instead of = below... in my case the JSON contains HTML entities %>
<%- @templateFn(model: component, templateFn: @templateFn) %>
<% end %>
<% end %>