If you are really into game programming, I think C++ is the way to go.
However, I just want to point out, that it isn't necessarily a good idea to throw him into a complicated irritating language that will have little to show for itself for a very long time. This is quite likely to turn him off to it. I would expect that it would be better to go with something more visual, so that he can really "see" his progress. This said, I'm going to suggest something like visual basic. It's not necessarily a great language, but if you go into C , C++ , Java, you're going to be dealing with a lot of command line interfacing. This might not appeal to your child. I think that NetBeans is Java with a GUI, though, so this might be a sufficient workaround, allowing him to write code without having to go to command line. But I haven't used it, so I can't say for sure.
On the other hand, many people enjoy games like Sudoku, which are essentially small problem solving experiences. If you can relay this concept to your son, he might enjoy these other languages quite a bit. I personally feel that way about it, I get excited in the challenge of the program, and as I learn more, I can slowly apply these things to more fruitful applications. But if you take this approach, you should understand it could be a very long time before you progress to anything graphical.
Another thing you might consider is a scripting language, I have a little bit of experience with Python, and a decent amount of experience with Ruby (which makes a good base to learn Rails from, which is pretty big right now in the realm of computer applications). A scripting language _might_ be a nice alternative (probably not if your'e wanting to go into game programming), it has the benefit of making things easier. They tend to be "easy going" few nuances, highly portable, generally friendlier. The downside is that there are things that you learn from using low level languages, that you don't necessarily experience in a high level scripting language (ie learning about pointers in C helped me transition to object oriented programming very easily, and have a decent idea of what is going on back there). It is a bit of a trade off, I suppose. But to learn those low level things, you really have to be dedicated to it.
Whatever language you choose, good luck. And if you do choose to go with Java, I will suggest the book Absolute Java by Walter Savitch, it is the best textbook that I have used (he wrote one for c++ too, but I haven't read it).
Also, for your Mac, if your son gets excited and ends up doing a lot on it, you will need a good text editor. I very very strongly recommend TextMate (it costs money), and I also very very strongly recommend "TextMate: Power Editing for the Mac" to learn how to use it. Good tools make for a happy programmer :) And TextMate is the best that I have seen.
And as a last thought, programming is more than a language, it is a way of thinking, it is an understanding of certain structures, it is an ability to translate a problem into a model for your computer. After he gets settled into a given language, you should really address these fundamental knowledge issues. A good data structures lesson is a must (I really liked my book, but it is written in C. There are certainly other resources, though, and it isn't that difficult to learn them, it is just good to have a reference so you can compare what you have done to what the standard is, and see where you differ, and evaluate why). Data structures teaches you the different ways that have been established for storing data, this is essential for how you translate a problem into a model. Beyond that, the discrete mathematics and algorithms courses are very useful for helping to develop those problem solving techniques and approaches. These are things that you need to address, no matter what language you choose.
Good luck to you, and just as a word of advice, to keep your son interested, so that it is him driving himself, and not you driving him, you need to keep him challenged. Present problems to him and see if he can solve them. This curiousity and challenge have driven me a hundred times further than my own "I should learn something now" thoughts ever have. I think that focusing on this aspect are really important to help him develop his own eagerness for coding, and that will easily transcend any incentives you might provide. Whats more, it develops a very important problem solving aspect in our brains, and teaches him that he can overcome challenges, that is, afterall, what a programmer does every time (s)he sits down to code :)
edit: oh, and keep him away from video games, unless you want to watch his productivity plummet ^_^