If I understand the intent correctly, then the following definitions should recognize valid forms:
ClearAll[formQ, listQ, atomQ, sequenceQ]
formQ[x___] := listQ[x] || atomQ[x]
atomQ[token[Except["("|")"]]] := True
atomQ[___] := False
listQ[token["("], x___, token[")"]] := sequenceQ[x]
listQ[___] := False
sequenceQ[] := True
sequenceQ[x__ /; formQ[x], y___ /; sequenceQ[y]] := True
sequenceQ[__] := False
The definitions of formQ and atomQ are essentially unchanged, with some minor tweaks for failure cases.
The main change is to the definition of listQ. A new helper function, sequenceQ has been introduced. Its purpose is to recognize a (possibly empty) sequence of valid forms. sequenceQ performs the "partitioning" requested in the question. It will extract a leading valid non-empty form, and then verify that what remains is a valid sequence. Condition (/;) is used in place of PatternTest (?) since, as noted in the question, the latter operates upon individual matched sequence elements instead of the whole matched sequence.
Be Careful Not To Defeat Back-Tracking
There is a subtlety in this definition. It is crucially important that the formQ and sequenceQ checks appear within the pattern itself and not within the body of the definition -- the following will not work:
(* do not do this! it disables back-tracking *)
sequenceQ[x__, y___] := formQ[x] && sequenceQ[y]
When the conditions appear in the pattern, the pattern matcher will back-track if the tests fail. In the absence of those tests, the pattern matcher will think that there is no need to back-track since it has found a successful match and gone ahead to execute the body of the definition.
It would be acceptable to move the condition onto the right-hand side like this:
(* this will work *)
sequenceQ[x__, y___] := True /; formQ[x] && sequenceQ[y]
On the face of it, the construction True /; ... might seem to be an awkward and unnecessary rephrasing of the previous expression. But do not be fooled: the meaning is quite different. Conditions (/;) are integrated into the pattern matching process, but tests in the main definition body are not.
Conditions of this form are often expressed thus:
(* this will work too *)
sequenceQ[x__, y___] /; formQ[x] && sequenceQ[y] := True
(* and so will this *)
sequenceQ[x__ /; formQ[x], y___ /; sequenceQ[y]] := True
Choose the form that suits your taste.
What About Back-Tracking In The Other Definitions?
formQ and listQ perform checks in their definition bodies in opposition to the advice just given. I left them that way for continuity from the original question. It so happens that those definitions do not require internal back-tracking to function correctly. In recognizers, I recommend adopting a policy of putting recognition checks in pattern conditions as a matter of course. Under such a policy, tests appear in definition bodies only when explicit back-tracking "cuts" are desired.
The definitions can be made to conform to this suggestion like this:
ClearAll[formQ, listQ, atomQ, sequenceQ]
formQ[x___] /; listQ[x] || atomQ[x] := True
formQ[___] := False
listQ[token["("], x___, token[")"]] /; sequenceQ[x] := True
listQ[___] := False
sequenceQ[] := True
sequenceQ[x__, y___] /; formQ[x] && sequenceQ[y] := True
sequenceQ[__] := False
atomQ[token[Except["("|")"]]] := True
atomQ[___] := False
Test Cases
All of the following test cases evaluate to True:
True === atomQ[token["3"]]
True === listQ[token["("], token["3"], token[")"]]
True === listQ[token["("], token["3"], token["("], token[")"], token[")"]]
True === formQ[token["3"]]
True === formQ[token["("], token[")"]]
True === formQ[token["("], token["("], token["("], token[")"], token[")"], token[")"]]
True === formQ[token["("], token["("], token[")"], token["("], token[")"], token[")"]]
False === formQ[token["("]]
False === formQ[token["("], token[")"], token["3"]]
False === formQ[token["("], token["1"], token["2"]]
False === formQ[token["1"], token["2"]]
False === atomQ[token["1"], token["2"]]
False === atomQ[]
False === listQ[]
False === formQ[]