There is a syntax difference between the two because there is a syntax difference between the two. If you mean "why is there a difference in result", I would say that the first returns the result of the expression in round brackets, which is the last match, whereas the second, having no () returns whether or not a match was found. The second also performs substitution, unlike the first. To get a,b,c,d you simply want to place ^(.*) ahead of the ending match to trap it ... I am dropping the s/ in this suggestion because it is a side effect so far not justified in the OP. Also I tend to escape punctuation because it might have special meaning, so ...
my ($val) = ($row =~ /^(.*)\,[^\,]*$/);
(untested)