Just wanted to revisit here and share something new I've found in regards to this that so far seems to be proving a nice clean work around. It took us a little while to get to this point (after trying some other painful and partial workarounds), so hopefully it will save someone else a bunch of tears.
There's a little hidden property you can set in the Local tags of an AOI (right click on any column in the Local Tags tab to show the hidden External Access column). You can actually make them externally accessible. Why do we care you might say? Well because I can't set a custom data type as a parameter in the AOI. I CAN however set a custom data type as a local tag and then Alias that tag back to the parameters. Doing that, and then referencing the Local DT in your Ignition UDT gets you the best of both worlds. We had a considerable library built around the access the AOI structure and having those same tags accessible on the face of the AOI and not wanting to create a bunch of extra in/out tags to make access work (those were some of the pains we went through).
Here's some screen shots to give you an idea of the setup. To test it out, I just did one instance of each of our 17 AOI's and set a bench test to a PLC on a local network with a scan class set to 10 ms (so that we could put some strain on the comms to see the difference with a smaller population of tags). The difference is quite remarkable.