The problem with your :normal command
You can't run ex commands from within a :normal command. Instead, you'll need to run your existing :normal command and then run the :substitute.
Try this:
:execute 'normal 6f,v3f,' | s/\%V.\+\%V/\=substitute(submatch(0),'\.','','g')
You need the :execute because otherwise there's no other way to complete the normal command so that you can run something else afterwards.
Running it on multiple lines
However, you can't apply this command to multiple lines with a :global command, because the :global will apply only to the first command before the bar. You will make a visual selection on every line, and then afterwards run your substitution once only.
The easiest fix for your actual task is probably to dispense with visual mode entirely, and instead use a single substitution that accounts for the commas in the regular expression itself:
:g/\./s/\v([^,]*,){6}\zs([^,]*,){3}/\=substitute(submatch(0),'\.','','g')/
The regular expression broken down:
\v([^,]*,){6}\zs([^,]*,){3}
\v " Using very-magic (so we don't need so many backslashes)
{6} " search for 6 copies
( ) " of a group containing
* " any number of
[^,] " characters that aren't a comma
, " followed by a comma
\zs " start the match (and thus the replacement) here
{3} " search for 3 copies
( ) " of a group containing
* " any number of
[^,] " characters that aren't a comma
, " followed by a comma
An alternative solution using macros
An alternative solution is to use a macro instead of :normal
Try typing this:
qq6f,v3f,:s/\%V.\+\%V/\=substitute(submatch(0),'\.','','g')/<CR>q
...in which <CR> is a single press of your Enter key.
This records a macro into your "q register which actually does your f and v commands in normal/visual mode instead of using :normal to emulate this, and then performs the substitution.
You can then play this back on a single line by typing @q, or play it back on multiple lines with e.g.:
:g/\./norm! @q