what exactly stops them being fully autonomous?
Nothing - except for the way any tight coupled multicore CPU starts up. After reset only the primary core starts executing code, while the rest is kept in a hold state, until prepared and released by the primary core. Further any control about the configuration can (usually) only be exerted by the primary core.
In case of the PS3 cores, this means only the PPE has the functionality to setup/start/stop a any SPE. So any OS must run on the PPE. Of course, it could as well run on the SPE, but the scheduler to assign tasks to cores has to run on the PPE. Eventually this includes many other central components/drivers, most notably memory and IPK drivers, as only the PPE can access all memory, while SPE are limited to their own. Not to mention generic I/O.
[In some way the setup is a distant remainder of classic Cray designs, were a general purpose I/O processor feeds specialized computing units - often itself supported by an external mainframe for schlepping the data - the I/O processor runs the OS, while the computing units do the 'superiour' work.]
In addition, the SPE are, as noted, reduced/specialized function version, so any code to run there must be made especially to fit this instruction set. Moving any task cross core only works between SPE, not between PPE and SPE or back (*1).
Due this limited nature assigning any task to a PPE has an overhead to be considered. Similar if this task requires intermediate I/O. They perform best if assigned long running self contained jobs.
A possible setup using the SPE as base for generic processing would effectively reduce the PPE to an I/O processor and making it a quite tight bottle neck.
Bottom line: Yes, in theory the SPE could be used for mundane tasks, but making them degrades the setup.
*1 - Yes, I'm aware, that come fine crafted code could be made to run on either, but beyond the most basic functions it will be a waste of resources one both.