Right, the loop finishes before the first setTimeout callback occurs. Your code schedules 20 callbacks that all occur, one after another, a second later.
You have two choices:
- Schedule each one a second later than the previous one, or 
- Don't schedule the next one until the previous one finishes 
#1 is simpler, so let's do that:
for (let o = 0; o < 20; o++) {
//   ^^^−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
   setTimeout(function () {
       tempPsum += array[o];
   }, 1000 * o);
//        ^^^^−−−−−−−−−−−−−−−−−−−−−−−−−−
}
By multiplying the delay time by o, we get 0 for the first timer, 1000 for the second, 3000 for the third...
Note the change from var to let. That way, there's a separate o for the callback to close over for each loop iteration. (See answers here, or...Chapter 2 of my new book. :-) )
If you can't use ES2015+ features in your environment, you can use the extra arguments to setTimeout instead:
for (var o = 0; o < 20; o++) {
   setTimeout(function (index) {
//                      ^^^^^−−−−−−−−−−−
       tempPsum += array[index];
//                       ^^^^^−−−−−−−−−−−
   }, 1000 * o, o);
//        ^^^^−−^−−−−−−−−−−−−−−−−−−−−−−−
}
That tells setTimeout to pass the third argument you give it to the callback as its first argument.