In general the answer is to use a lookahead because they, in effect, let you check 2 separate things from the same starting position.
Normally the regex engine maintains a pointer into the text that is incremented each time the "current" character (i.e. the one being pointed to) matches the current part of the regex pattern. The only way the pointer is moved backwards is via the backtracking mechanism but that only gets invoked when the pattern cannot be matched and the regex engine is searching for other possible ways of matching the text to the pattern.
The lookahead mechanism can be thought of like a "subroutine" in that the text pointer is saved, the lookahead pattern is processed and, when it is complete, the previous text pointer is restored.
Therefore you could use a pattern such as:
^(?=[^aeiou]*[aeiou]([^aeiou]*[aeiou])?[^aeiou]*$)[a-rt-z]{8}$
HOWEVER, you have not mentioned the regex variant you have used and, while the above pattern doesn't use anything too exotic, there is no guarantee that it will work with your regex variant or it may require some syntax changes to work. Also this assumes that same option settings (such as "ignore case") as you are using in your examples.
The lookahead is a bit messy to allow for the 1 or 2 vowel situation. You could also write it as:
^(?=([^aeiou]*[aeiou]){1,2}[^aeiou]*$)[a-rt-z]{8}$
but this effectively is the same thing.
Susan