I'm a little confused about how subdescriptions are stored and how I can get access to them. I'm pretty familiar with how Descriptions work and how to access the different parameters within them, I think.

The problem is that Vector_X is not a description that belongs to an object.
That's why you can get things like "P" using: DescID id = DescID(DescLevel(ID_BASEOBJECT_REL_POSITION, 0, 0));
That description is in the Obase.res, Obase.h, and Obase.str files

But things like Vector_X is in a different header file called: lib_description.h
And when an object is created. This is somehow imported from that file using this code in the object's .res file:

I don't know how this code causes the VECTOR_X, VECTOR_Y, VECTOR_Z to be imported.
It's still a mystery to me how it's doing that.
The vector gizmos seem to be coming from a custom data type plugin?

But your question has actually been asked several times here. Only it was asked differently
The question asked many times here is:
"When we drag an object into the console. How does it know where to grab the subdescriptions stuff like the Vector_X description?"

Maxon has never answered this question for some reason. And I don't know why.
But think the answer to that question holds the answer you're looking for.

Are you sure that it is not crashing on the bc->GetString()? If there is no matching description container for the DescID, GetParameterI() may return NULL into bc.

It also appears that GetParameterI() has issues with 'nested' DescLevels. Check out the thread "Description ID to String" for a way around this (although burdensome using a while loop). Also do a forum search for GetParameterI. There are exactly four uses of this method in the entire cinema4dsdk source (go figure), none which is useful for your purposes.

The Vector_X, Vector_Y, Vector_Z text that we see when we drag from the AM into the Console is coming from this file:C:\Program Files\MAXON\YOUR VERSION\resource\res\description\dvector.res

If you change the IDs in this .res file and it's accompanying .h file to something else. You will see the new names show up in the Console when you do the Drag&Drop with them to the Console.

Cube[c4d.ID_BASEOBJECT_REL_POSITION,c4d.VECTOR_X] <--- original
Cube[c4d.ID_BASEOBJECT_REL_POSITION,c4d.VECTOR_X1] <--- After we change the dvector.h & dvector.res files

So what this means is that when we Drag & Drop from the AM to the Console. Maxon is somehow reading these .res & .h files found in the C:\Program Files\MAXON\YOUR VERSION\resource\res\description **** folder. **** And then converting the IDs in them to text.
Then displaying the text from them in the Console. **

**I Still don't know how we (the users) can do this same thing yet in our own code.
But I thought it was an interesting discovery. **