I used to create "xhr" circuits for handling ajax requests that had their own layout and whatnot, but since standardizing to jQuery I've eschewed approaches like that for a simpler one.
Every AJAX request from jQuery has a request header called "X-Requested-With" with a value of "XMLHttpRequest". Leveraging this header, my apps contain a "mode" object with the methods isAJAX(), isProduction(), isLocal(), and isRobot(). At the top of my global layout file, I check to see whether the request is an AJAX request, and if it is, output the buffer and exit the template. This approach provides some nice advantages. I can call any action as an AJAX request or a regular HTTP request, and the layout is automatically parsed based on the type of request. There's no need determine anywhere else in the code whether the request is an AJAX one or not.
Here's my simple isAJAX() function:
<cffunction name="isAJAX" access="public" output="false" returntype="boolean">
<cfset var hdrs = getHTTPRequestData().headers />
<cfif structKeyExists(hdrs,'X-Requested-With') AND hdrs['X-Requested-With'] EQ "XMLHttpRequest">
<cfreturn true />
</cfif>
<cfreturn false />
</cffunction>
And this is what I have up near the top of my global layout:
<cfif application.mode.isAJAX()>
<cfsetting showdebugoutput="false" />
<cfcontent reset="yes" />
<cfoutput>#body#</cfoutput>
<cfexit method="exittemplate" />
</cfif>
And that's it. No need for any mention of AJAX this or not AJAX that anywhere else in the code (except the occasional remote method in an XHR proxy object when you need some JSON data or something, but that's another matter).