Duh,
The substitution was including the surrounding characters.
The following code does the trick.
my $string = '"data","home 966-2815, cell 567-9832","data"';
print "string before sub = $string\n";
while($string =~ /[^"],[^"]/g){
my $pos = pos($string);
substr($string,$pos-2,1) = ':';
}...