We can look at this in pieces. Let's first examine your code:
For[i = 1, i <= pointCount, i++, zPot = 0;
For[j = 1, j <= chargeCount, j++,
zPot += chargeList[[j]][[4]]/
Sqrt[(testPointList[[i]][[1]] -
chargeList[[j]][[1]])^2 + (testPointList[[i]][[2]] -
chargeList[[j]][[2]])^2 + (testPointList[[i]][[3]] -
chargeList[[j]][[3]])^2]] AppendTo[
zField, {testPointList[[i]][[1]], testPointList[[i]][[2]],
zPot}]];
The outer loop can be changed in a Table command:
zField1 = Table[zPot = 0;
For[j = 1, j <= chargeCount, j++,
zPot += chargeList[[j]][[4]]/
Sqrt[(testPointList[[i]][[1]] -
chargeList[[j]][[1]])^2 + (testPointList[[i]][[2]] -
chargeList[[j]][[2]])^2 + (testPointList[[i]][[3]] -
chargeList[[j]][[3]])^2]] ;
{testPointList[[i]][[1]], testPointList[[i]][[2]], zPot}
, {i, 1, pointCount}];
As you can see, zField1 is now being assigned as a total result rather than appended to. Then let's take one more step and remove the inner For loop and replace it with the use of Total and Map:
zField2 = Table[
zPot =
Total[Map[#[[4]]/
Sqrt[(testPointList[[i]][[1]] - #[[1]])^2 + \
(testPointList[[i]][[2]] - #[[2]])^2 + (testPointList[[i]][[3]] - \
#[[3]])^2] &, chargeList]];
{testPointList[[i]][[1]], testPointList[[i]][[2]], zPot}
, {i, 1, pointCount}];
Here, Map applies the operation you were doing item by item and Total sums the individual elements. Next, Mathematica has the Norm function built in and this can replace your Sqrt of the sum of the squares:
zField3 = Table[
zPot =
Total[Map[#[[4]]/Norm[testPointList[[i]] - #[[1 ;; 3]]] &,
chargeList]];
{testPointList[[i]][[1]], testPointList[[i]][[2]], zPot}
, {i, 1, pointCount}];
I prefer not to index anything if I don't have to. Here, I've created a function, midFunc, which does some of the work, which I will use in a Map call:
zFieldPiece[testPoint_, charges_] := {testPoint[[1]], testPoint[[2]],
Total[Map[#[[4]]/Norm[testPoint - #[[1 ;; 3]]] &, chargeList]] }
zField4 = Map[zFieldPiece[#, chargeList] &, testPointList];
The speed up advantage has largely been gained by removing the For loops. The trouble with a For loop is that the code creates iterators that must be interpreted. Some of the changes I made, however, were strictly for readability. Norm is also optimized when you get to larger lists though I doubt you'd see much of a difference in this case. One other item you may notice is that I avoided assignment statements when at all possible. Assignment statements are extra steps and while this is again, not likely to be a major difference, can add up in very large data sets. You may not that I only used Set exactly once and SetDelayed exactly once in the final result.