Sounds like a new team member in the making here! This could be quite interesting.
Hey devs, I'm looking to write a mod and have it eventually incorporated into C2C. For now, I'm not worrying about compatibility as I'm going to make it separately first.
This is unwise. C2C has changed many fundamental logic streams from Vanilla BtS very significantly. The merge process would be horrifying if you weren't working from C2C sourcecodes as a base.
I've never modded for Civ4 (or any game) before, but I'm experienced in C++ and game dev.
That should work to give you a lot more insight than I had when I started! Now... with this background, clearly you would be familiar with using the tools available to you in VS to find all references, go to the function, go to the header, etc... right? These are generally THE tools to figure out how to find the information you're looking for. However, it can help to understand some of the fundamental architecture of the .h and .cpp files and naming conventions.
The way I would think of your project is that it's probably in the code in a few primary spots. The first would be the game RULES that enable or allow, which you are referring to by saying you're trying to first figure out how to make it possible. That's right, that's where I would start. And for THAT you'd generally find that in the file that works with the layer of game object that makes this determination in the first place (this determination being 'to vassalize or not to vassalize'.) In this case, you'd (I think) be talking about the player. If not the player then the team... I'm not extremely familiar with Vassal rules because I don't personally like the option at all. (This does not mean I have any judgement for a player who does appreciate Vassalization in the game.)
So you're probably going to find something like canCapitulate or canVassal or canVassalize, or something along those lines, in CvPlayer.cpp. However, there are likely added rules built directly into the AI regarding how they can come to offer, receive an offer, and how they are instructed to react to that offer. All of that would be, (most likely) in CvPlayerAI.cpp.
My advice is to read the code patiently, both before and after the function you suspect controls the determination you wish to alter the rules on and PROVE to yourself that where you are looking to adjust the code is exactly where you should be adjusting it. There are sometimes varous layers of validation, player level, team level, game level, and these layers can be strung together. You'll see this in places like the determination of what you can build or train. canTrain, for example, exists at the city level, but also at the player and the team and the specific game overall and to enable the ability of a city to train a unit, said unit must be qualified on all checks on all levels. There may be a similar chain for checking to see if a vassal can become or offer vassalization. Careful reading of the functions involving vassalization will be both illuminating and critical to understanding in depth to figure out everywhere you're going to need to make an adjustment.
So I might start with searches through the files suspected of controlling these rules, using Ctrl-F, of terms that one might think to establish these rules under, such as Vassal, Capitulate, etc... and once you start narrowing in on things in the source files, you start researching and following the program logic. You'll probably learn there's numerous other things to consider, like how the AI evaluates these choices, display matters that may become an issue, how to get the option to come up in the diplomacy screen (though I don't think from your description that you'll need to do this as it sounds like you're just looking to expand on when and who can offer and accept capitulation.)
That doesn't seem to have to do with the logic determining whether a civilization offers vassalage (whether it was capitulated or not), but it does seem like it MAY deal with allowing vassals to have vassals. However, I don't really know much beyond this, it is difficult to research.
Make sure to research deeply in the souce codes before grepping the python files. Py is more for extensions of rules and sometimes is not so good for opening up new ways for established rules to function.
If you don't have the source codes, I may need to get your sourceforge username and give you a conditional access to them from the SVN download.