electrotype's answer did technically work for me, however I have two qualms with it.
It's based on a script/API/library which is intended for a much wider set of use cases, and as such, it's extreme overkill for this particular case.
It requires you to use a different keystroke (Ctrl+Alt+Home), rather than just Ctrl+Win+arrow, or any other less annoying hotkey.
It took a while, but after a lot of close examination (I'm not an AHK expert), I was able to reverse engineer the behavior out of the heavily-abstracted script. For the purposes of this question, the entire 672 lines can effectively be replaced with only 4:
Hotkey, ^!Home, goToLeftVirtualDesktop
goToLeftVirtualDesktop:
Send {Ctrl down}{LWin down}{Left}{LWin up}{Ctrl up}
Return
The only functional difference is that the original script hooks into the Windows virtual desktop framework in order to determine which local virtual desktop (VD) you are currently on (in electrotype's and my case, that's either VD 1 or VD 2). So when you're in a full-screen Remote Desktop (RD) session, pressing Ctrl+Alt+Home first brings up the RD title bar (that's just default RD behavior, and forces RD to release control of your inputs), and pressing Ctrl+Alt+Home again triggers AHK (now that the local system has focus) to Send
either Ctrl+Win+← or Ctrl+Win+→, depending on which desktop you're on.
If, as in my case, you always keep your full-screen remote session on VD 2, then the above 4 lines will accomplish the same thing, except that you no longer have the option of using Ctrl+Alt+Home to switch back from VD 1 to VD 2. But you can just use Ctrl+Win+→ to do that normally. Using the same (wrong) keystroke to go from VD 1 to VD 2 is not worth the extra 668 lines of code IMO.
So that solves qualm #1.
Unfortunately qualm #2 is more complicated, and even the over-engineered script from electrotype's answer doesn't (and can't) solve it. The problem is that the RD session seems to capture all key combinations until such time as you have used Ctrl+Alt+Home to escape out of the RD session, so that key combo must be pressed first. That is of course unless you change the RD "Apply Windows key combinations" setting to "On this computer", but one of the core premises of this question (for most of us here), is how to achieve the desired result without changing this setting, since doing so breaks functionality such as Alt+Tab in the RD session.
I've seen some other questions/answers suggesting it's possible via different complicated scripting mechanisms, or combinations of local plus remote AHK scripts, but those are outside the scope of this answer. I hope to find one that works at some point.
At any rate, if you just wanted the functionality of Ctrl+Alt+Home (twice) to switch your desktop, away from a full-screen RD session, in a much more understandable script, then here's your answer. Since it's only 4 lines, it's at least much easier to customize which VD you want to switch to.
P.S. As an aside, I will also just note that, in my quest to make Ctrl+Win+arrow capturable out of a full-screen RD session I came across many posts claiming that reloading or suspending and un-suspending the AHK script after the RD session is full-screened will allow defined Hotkey
s to function, even when the full-screen RD session has focus. However I tried countless variations on this theme and could not get any response from AHK whatsoever, until Ctrl+Alt+Home was pressed. My assumption is that these claims are either outdated and do not apply to the latest RD application, or they were simply working with RD's "Apply Windows key combinations" setting set to "On this computer". Additionally, some of them were using 3rd party RD applications, which presumably handle input capture differently.
Update: I did eventually get the following script to sometimes activate the full-screen RD session titlebar:
#NoEnv
#SingleInstance force
#UseHook
#Persistent
SendMode Input
Active := false
SetTimer RDPActive, 500
Return
RDPActive:
if WinActive("ahk_class TscShellContainerClass") {
if(!Active) {
Active := true
SoundBeep 1500
Suspend off
Hotkey F2, Pressed, on
}
}
else {
if(Active) {
Active := false
SoundBeep 1000
Suspend on
}
}
Return
Pressed:
SoundBeep 2000
Send {LCtrl down}{LAlt down}{Home}{LAlt up}{LCtrl up}
;Sleep 500
;Send {LCtrl down}{LWin down}{Left}{LWin up}{LCtrl up}
Return
However it's incredibly inconsistent, and I haven't figured out why. Even if it worked 100% of the time, it uses F2 as the Hotkey, and I've not been able to get Ctrl+Win+arrow to be recognized in the RD session at all.