[Not really an answer - but too big for a comment]
I think the behavior you're seeing is related to the first atom of your FPAT - which potentially has a zero-length match i.e. ([^,])* matches zero or more non-comma characters - but exactly how it is related eludes me at this point. Consider for example (GNU Awk 4.0.1):
$ echo "a,b,c,d,e,f,g,h,i,j,k,l,\"m,n\"" |
gawk '
BEGIN{FPAT="([^,])*|(\"[^\"]+\")";OFS=","}
{print $0; $4=$4; print $0; print NF}
' a,b,c,d,e,f,g,h,i,j,k,l,"m,n"
a,b,c,d,,e,f,g,h,i,j,k,l,"m,n"
14
whereas if we access the value of NF before the re-assignement
$ echo "a,b,c,d,e,f,g,h,i,j,k,l,\"m,n\"" |
gawk '
BEGIN{FPAT="([^,])*|(\"[^\"]+\")";OFS=","}
{print $0; print NF; $4=$4; print $0; print NF}
'
a,b,c,d,e,f,g,h,i,j,k,l,"m,n"
13
a,b,c,d,e,f,g,h,i,j,k,l,"m,n"
13
Regardless, the behavior seems to be unambiguous if you change FPAT to only match non-empty sequences:
$ echo "a,b,c,d,e,f,g,h,i,j,k,l,\"m,n\"" |
gawk '
BEGIN{FPAT="([^,]+)|(\"[^\"]+\")";OFS=","}
{$4="TDP,-1,-1,0,0" OFS $4; print $0}
'
a,b,c,TDP,-1,-1,0,0,d,e,f,g,h,i,j,k,l,"m,n"