When they say O(1), they mean "amortized cost". Some operations may be more expensive, but the average cost of an operation is still O(1).
My original answer is below. I realized that my proof could be massively simplified.
Let's suppose the current array size is P = 2^n. Some number of elements k were copied from the previous array into this array. Each time we do a copy, we copy twice the number of elements we did on the previous copy. So the total number of elements moved is k + k/2 + k/4 + ... which is less than 2k which is less than 2P.
If we've performed N operations, the size of the array is less than 2N, and we've performed less than 4N copies. Hence the number of copies is O(N). QED
Note that I never used 2/3 in the proof. The only thing we need is that each copy is double the size of the previous one, and that the array size is proportional to the number of operations.
Here is my original answer.
Let's pretend we copy when the array is 3/4 full. The idea is still the same, but we can work with whole numbers. We copy 6 elements from and array of size 8 to 16. We copy 12 elements to the array of size 32. We copy 24 elements to the array of size 64.
[I'm using ^ to mean exponentation, not exclusive or.]
So we end up copying a total of 6(1 + 2 + 4 + ... 2^n) elements into an array of 2^(n + 3). But that first number is less than 6 * 2^(n + 1) which is 1.5 * 2^(n * 3). So whatever size array we're currently at, the total amount of copying to get to the array is less than 1.5 times the size of the array.