I banged my head enough and actually came up with a solution this this. It's kind of goofy but it's the only thing that I can find that works:
1) You need to stop using the dynamically generated script files (ScriptResource.axd) and instead, reference the static .js files for both "System.Web.Extensions" and the Ajax Control Toolkit. Here's a helpful article that showed me how to do this:
http://blogs.msdn.com/jorman/archive/2007/05/18/referencing-js-files-for-the-ajax-control-toolkit.aspx
If you follow this article (remember it depends on the version of the Ajax Control Toolkit you are using, I am using version 1.0.20229.20821 which is the last version of the 2.0 Toolkit - you can get these from http://ajaxcontroltoolkit.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=11121), put the static .js files in the root of your web app in a "Scripts" folder the way the article above says, and add this "ScriptPath" attribute to the <ScriptManager> tag on the rendered page and see that the page is now referencing the static .js files.
2) If the page is gatewayed, the only other step is (and this is kind of hacky) but you must parse out the fully qualified gatewayed link to your page and use it to programatically RESET the ScriptPath attribute to your static .js files in the root of your Web App every time the page loads to the value of the fully qualified gatewayed link (put it in the Page_Load() function so it runs every time, postback or not).
I did this by parsing out the gatewayed link from the portal's "HTTP_CSP_GATEWAY_SPECIFIC_CONFIG" header variable. Inside this is a parameter of PT-Hostpage-URI which contains the address of the gatewayed page.
Parse this out, and reset it every time in the Page_Load() function. It never changes, but somehow the .NET app loses its reference to this when gatewayed - hence our error. So I re-apply it every time, and presto, I can use the Standard .NET Ajax Extensions with the Ajax Control Toolkit like I described above (using UpdatePanel to dynamically add AutoCompleteExtenders to Textboxes).
So, for example, on every Page_Load(), I am resetting the ScriptPath to:
http://PortalServerName/portal/server.pt/gateway/PTARGS_0_16064_352_210_0_43/http%3B/ExternalCodeServerName%3B80/MyAjaxWebAppName/Scripts/
Where PortalServerName is the name of my portal server, and ExternalCodeServerName is the server where the .NET code lives.
I know this may be a little confusing, but it does work for me. Hopefully it will work for you.