It's just so vast. Here's what I can think of for a good foundation, with suggestions for each topic in ~descending order of importance:
Learn the common languages: C, C++, and Java.
C has a lot of downfalls, but it's fast and pretty much everyone knows it. Most Free software is written in C. You should be able to create and dereference pointers, lists of pointers, pointers to pointers to arrays of pointers, etc. Try finding potential buffer overflows in your own programs, or others'. Use valgrind to find memory leaks.
C++ is the opposite of C in terms of simplicity, but pretty much every software company who needs performance uses it. Classes, inheritance, scalar vs. array allocation, constructors/destructors, templates, STL, Boost.
Java is bloatier than C++ in some ways, and more streamlined in others. If your company isn't using C++, it's probably using Java. Much of what you learned about C++ applies.
Learn about how things work at the machine level.
Assembly code is still good to know for when you're debugging. Try porting a C program to asm piece by piece. Try writing programs for old computers like the C64, which have a simpler instruction set. Read The Art of Assembly Language
Understanding how the CPU works is good for the same reason. Write a cycle-accurate emulator for a simple (or fictional) CPU. Read Computer Architecture: A Quantitative Approach
Try breaking the copy protection on an old game, or reverse engineering a data format using an assembly level debugger. The same techniques will come in useful when your own code is failing in confusing ways.
Learn about algorithms and efficiency.
Write a recursive algorithm, try flood-fill first.
Learn Big O() notation. Write a linked list, a binary search tree, and a hash table, and know when to use each. Have CLR
on your bookshelf as a reference.
(If you're interested in games, write a binary space partitioning tree and a quadtree later.)
(If you're interested in filesystems and databases, write a B+ tree later.)
Use higher level languages. In most cases, the execution speed to programming speed tradeoff is worth it.
Perl, ruby, and python are all popular. Python is my workhorse for 90% of my new projects.
Write a non-trivial program in LISP. I haven't touched on functional languages so far because they're so unpopular. But it will change the way you think about programming.
I'm sure there are gaping holes in this, but it's all stuff I use in my daily life. Wikipedia is usually an adequate starting point for any programming topic.