It was the use of align. Align is basically shorthand for pos and anchor, so:
align (0.95, 0.95)
==
pos (0.95, 0.95)
anchor (0.95, 0.95)
The issue is that as the action screen gets wider when sub menus open up, the x anchor ends up moving further inwards as 100*0.05 == 5, but 200*0.05 = 10. It was only really noticeable when I was testing with the maximum number of sub menus as it became more and more pronounced.
I've fixed it by changing the default arguments to pos=(0.98, 0.98), anchor=(1.0, 1.0), align=None so it gets positioned at the same place but has its anchor set at the very end.
TBH naming the positional arguments like that is probably for the best. Certainly matches the rest of the screen code, although I did like how left/right top/down sounds.