Learning C++ and learning to become proficient with the internal mechanisms of a CPU are completely different scenarios.
Using the bare registers is not purer C++ than calling a function wrapping the same functionality.
I am of the opinion that learning with a solid foundation is the best way to start coding
Solid foundation in what, C++, or a particular architecture?
If you are after a good C++ background, then stick to the Arduino API, it will allow you to focus your attention on the pure C++, even the little AVR comes with a learning curve which is something that will be better understood once you can utilize the language.
If you are after a strong AVR background you could even use assembler and avoid C++ altogether. Then you are as close to the metal as you can get, writing out instructions one after the other, and is pretty much 0% portable (apart from the knowledge of how to program ASM, everything else is quite specific to the architecture).
Of course things like communication technologies are similar due to protocols, however the hardware implementations of these can vary considerably between processors. Even in the Arduino world there is a staggering difference in implementation between the Arduino Uno and Arduino Due processors.
As for the books, save your money if you're after a C++ book, there is usually far better information freely available online, like Cplusplus.com / C++FAQ's / Bjarne Stroustrup's site / C++ Standard
There are many Arduino books available, and I'm sure some of the authors on this forum will wander by and mention them. You are also on one of the biggest Arduino resources.
The best teacher is never a book though, its yourself.
- Write code, discover problems, research a solution.
- Read code others write, try and apply it to your own code (not copying).
- Reinvent the wheel to prove what you know and reinforce what you have learnt.
*Repeat (most important)