One way to do this is to create your own schema that defines each "resource" (doctor, specialty, condition) and their relationships. Each of the main objects extends modResource and might have its own table to hold the fields that aren't in the modResource object.
The relationships are stored in intersect tables and are represented by objects like these in the schema:
modDoctorSpecialty
modConditionTreatment
The table holding the modDoctorSpecialty objects, for example, would typically have just three fields, one containing the autoincrement ID of the intersect, one for the ID of the doctor and one for the ID of the specialty.
This approach does away with TVs altogether. TVs are very convenient, but as you suspect, they suck big time when it comes to searching and sorting data for display. OTOH, doing it this way is very time-consuming to set up and requires a fair amount of custom code to use. It's probably not worth it unless you will have a significant number of related pages.
On the plus side, it would allow you do *very* fast searches like these:
$doctor->getMany('Specialties');
$condition->getMany('Treatments');
This page might be helpful, although some of it will not apply since you would need multiple inter-related objects that extend modResource:
http://bobsguides.com/blog.html/2014/06/02/why-extend-modresource/