The Microsoft Speech Recognition engine, which VoiceAttack uses, is used to match what you say to a list of possible phrases.
A command name like
Open Bible to [matthew,mark,luke,john] chapter [1..100] is just convenient shorthand to generate every possible variation;
E.G.
Open Bible to matthew chapter 1
Open Bible to matthew chapter 2
Open Bible to matthew chapter 3
...
Open Bible to matthew chapter 100
Open Bible to mark chapter 1
...
Open Bible to mark chapter 100
Etc...
Without this list, the speech engine has to deduce what you might be trying to say, from all the possibilities in the English language. Understandably, this method is much less accurate than matching to a known phrase.
You can do this using wildcards. This means the speech engine will partially match a phrase, and anything that doesn't belong to that phrase is output to a token.
E.G.
Open Bible to [matthew,mark,luke,john] chapter *When you say "open bible to matthew chapter twenty", the speech engine, if well trained and with some luck, will recognize "open bible to matthew chapter ", and you can use the "{CMD_AFTER}" token to retrieve "20".
As this relies on the aforementioned freeform recognition, it may not be accurate enough in practice.
As an alternative, you can split up you command into
Open Bible to [matthew,mark,luke,john] and
chapter [0..100]. In this example that should mean it generates four variations for the first command, and 100 for the second, totaling 104 phrases.
All that said, Gary has stated before that phrase variations only perceptibly affect the profile load time, not speech engine performance, so if you can stand to wait for the profile to load in, it's not necessary to change anything.
could this be better done with pre-fix/suffix?
No. Prefix/Suffix is just a different kind of shorthand. It'll generate just as many variations.