The one thing you don't mention is programming. You need to be a competent programmer to go very far in CS. You probably need more than one language, say an OO language (java, python) and another, either more procedural (C) or functional (Scheme, ML). Different languages require a different mind-set so start with one and get competent in it.
The best way, after some initial study is to do some project that is large and defined by someone else. Perhaps you can find descriptions of "term projects" in books or online.
Once you have programming skills you want to gain competence in data structures and algorithms. There are a lot of good books on this. This is a fairly mathematical study.
A good fusion book, combining the above, but useful after you've studied both is The Science of Programming by David Gries, which is old, but still relevant. It is more in the procedural family, but combines ideas of programming and data structures.
For the rest, find a good department of CS somewhere and look at what they have online about their curriculum. The required undergraduate courses give a good basis as an outline of further study even if you do it on your own. Some will list required text books.
The hardest part of self study is getting feedback on your efforts. It is one thing to do a lot of exercises from textbooks, but it is another to assure that you have gathered the right insights and don't have misconceptions.
As for your list of areas for a career, note that Theoretical CS is mostly an academic area requiring a doctorate for entry. The others are practiced in some large companies (Google, IBM, Oracle, ...), but theoreticians are a bit rare there.
Note that Software Engineering is related to CS, not quite the same, and more amenable to a non-academic career. You can find curricula for SE online, just as for CS. Software Engineering includes things like Human Factors.
Higher level math is a bit harder to follow on your own, as insight is much more subtle there with feedback likely more important for most people.