Just do it methodically :)
V → ω X V → V X V → ω
V → ω X? ⇒ V → X* ⇒ V → ω | ζ ⇒
V → ω V → V → ζ
Of course, if you have to do more than one of the above in a single production, you'll need to introduce new non-terminals.
So:
factor : ('(' expr ')' | procedure | variable) ('.' variable | call)* '!'?
A. Introduce new non-terminals:
factor : factor-prefix factor-suffix '!'?
factor-prefix : '(' expr ')' | procedure | variable
factor-suffix : factor-continue*
factor-continue : '.' variable | call
B. Substitute according to above rules
factor : factor-prefix factor-suffix '!'?
⇒
factor : factor-prefix factor-suffix '!'
factor : factor-prefix factor-suffix
factor-prefix : '(' expr ')' | procedure | variable
⇒
factor-prefix : '(' expr ')'
factor-prefix : procedure
factor-prefix : variable
factor-suffix : factor-continue*
⇒
factor-suffix : factor-suffix factor-continue
factor-suffix :
factor-continue : '.' variable | call
⇒
factor-continue : '.' variable
factor-continue : call