I agree with Joby - Arduino is great but I always feel stifled by the framework they surround me with. I'd move on to use straight C on your Arduino and build a lot of the library functionality they provided from scratch. I generally prefer depth before breadth - don't just start on another microcontroller family by using more provided frameworks. Learn a bit more about how to implement some of these functions yourself.
Start with a working program and replace the Arduino library calls with your own versions one function at a time. You'll learn a lot about the control registers, timing, bit operations, etc if you havent' already. Read the ATMega328 datasheet in depth - everything you need is in there.
Try a different IDE like AVR Studio or Code::Blocks. Learn the GCC toolchain. Try more advanced coding techniques - unit tests, coverage, profiling, lint/splint checking. Put an RTOS on the Arduino.
A combined programmer/controller isn't a sign of weakness - it's just a design choice. The only 'weakness' that could come from it is the lack of in-circuit debugging. Buy an AVR Dragon and you'll have that licked for $50.