The bug is reproducible with GNU Awk 4.0.1 .
Manual page gawk(1), section Fields:
"References to non-existent fields (i.e. fields after $NF) produce the null-string."
"Assigning a value to an existing field causes the whole record to be rebuilt when $0 is referenced."
I think the bug is in some optimization to avoid useless field splitting prior to printing $0. It is confusing "non-existent fields" with "non-referenced but existent fields".
Referencing NF or a greater non-existent field (like $7) works correctly because the complete field splitting is required, which avoids the optimization and its bug.
It does not matter what field number you reassign to provoke the $0 recomputation, it is just that the right side of an assignment is also an _expression_ where to put the workaround reference:
$ awk -v FPAT='([^,]*)|("[^"]+")' -v OFS=';' '{ NF = NF } 1' file
"A";"B";"C"
$ awk -v FPAT='([^,]*)|("[^"]+")' -v OFS=';' '{ $NF = $NF } 1' file
"A";"B";"C"
$ awk -v FPAT='([^,]*)|("[^"]+")' -v OFS=';' '{ $7; $1 = $1 } 1' file
"A";"B";"C"
These tests show that $0 is recomputed in between expressions, not only full sentences or action blocks. Also, that the bug increases NF by inserting a null-string field at the next position where the optimization stops the splitting:
$ awk -v FPAT='([^,]*)|("[^"]+")' -v OFS=';' '{ $1=$1; print NF " " $0 }' file
3 "A";"B";"C"
$ awk -v FPAT='([^,]*)|("[^"]+")' -v OFS=';' '{ $1=$1; print $0 " " NF " |" $2 "|" }' file
"A";;"B";"C" 4 ||
Regards.