I tend to use the following rules:
Request and return HTML for quick snippets, then use client-side (static) Javascript to insert them. Great for alert messages.
Request and return JSON for large datasets. This works great when you want to do filtering, grouping, or sorting on the client side without re-requesting the data in a different form.
Request and return JSON for large datasets, but include the (escaped) HTML snippet for each record in the JSON record. This means more rendering time and more bandwidth use than (2), but can reduce duplication of often complex HTML rendering.
Request and return Javascript, and eval
it client-side. This works best for interactions such as hiding, showing, moving, and deleting. It can work for insertions as well, but often type (1) or (5) work better for that.
Request and return Javascript, and eval
it client-side, but include escaped HTML in the Javascript so the server is doing the HTML rendering.
I probably use 5 and 1 the most often.