I can see how "X = X + 1" could be confusing to someone who has never been exposed to programming before. All your life you're taught in math classes that "=" means the things on both sides are "equal" at all times.
Maybe replacing the "=" with an array while teaching would be helpful. Then once he understands the concept, try to introduce the "=" syntax.
This is why a certain language used := as the assignment operator and = as the boolean equality operator. It really doesn't make sense as written when compared to all of the maths people have learned up to the point they are introduced to programming. It's where learning about addressable memory and pointers compared to the values stored at those addresses actually made more sense to me than the optimized syntax (at least when I was 12 or so). It also operates backwards in most languages, where the stuff on the right of the equals happens before the stuff on the left. It really should be something that reads as "take the value in box with address x, add one to it, and store the value back in the box with address x" (basically show the student what the assembly language looks like).
I really don't have a problem with people not getting x=x+1, I think it shows someone is actually trying to deeply understand what is going on.
I think that this is one of those areas that would be greatly improved by starting students with assembly. It's fairly easy to grasp what each statement does in a small instruction set like MIPS since there aren't these sorts of preconceived ideas. Then once students have learned assembly, teachers can explain statements such as "X=X+1" unambiguously with the assembly instructions the students are familiar with.
I disagree about starting students on assembly. Assembly exposes all the implementation details on how we got computers to work efficiently, and exposes none of the theoretical basis for computation. Obviously you need to know both eventually, but to get started, I think it's a better idea to build on the mathematics students already know.
Say you want to print 2+2. In assembly, you have to put a two in two certain registers, then call add, then call a routine to convert the number 4 to the string "4\0", then find a file descriptor, then signal the OS that you want to make a system call (fwrite), ...
That is not a good way of teaching how computation works. The details in this case are arbitrary and irrelevant; there is no reason a computer has to distinguish between the string "4" and the result of adding 2 and 2.
Actually, I did at one point diagram all of the states of X across time, so it was an array. (There was also iteration in a loop involved.) I think this only confused him even more, though.
Maybe replacing the "=" with an array while teaching would be helpful. Then once he understands the concept, try to introduce the "=" syntax.