As Lukas Ruf so kindly pointed out to me, I was missing the obvious that my terms were still parsing /etc/profile each time they were ran, so I added a condition to check whether $DISPLAY contains a value or not, and run 'startx && exit' if $DISPLAY is empty.
-Rob