I think making an array of the checkboxes first is a good idea,
maybe something along these lines:
For opacity (hiding text-layers):
controls = thisComp.layer("Null 1")("Effects");
checks = [];
for (i=1; i <=controls.numProperties; i++) {
if (controls(i)(1).name=="Checkbox") checks.push(controls(i)(1).value);
}
firstTextLayerIndex=2;
myIndex = index-firstTextLayerIndex;
checks[myIndex]*100;
For position (text-layers):
controls = thisComp.layer("Null 1")("Effects");
checks = [];
for (i=1; i <= controls.numProperties; i++) {
if (controls(i)(1).name=="Checkbox") checks.push(controls(i)(1).value);
}
numActive = checks.reduce((a,b) => a+b ,0);
firstTextLayerIndex=2;
myIndex = index-firstTextLayerIndex;
linespacing = 980/numActive;
top = 0;
for(i=0; i < myIndex; i++) {
if (checks[i]) top+=linespacing;
}
thisComp.layer(firstTextLayerIndex).position + [0,top];
Of course this is assuming the texts are never breaking to be more than 1 line high, that would make it a bit more complex, looping through all the sourceRectAtTimes to calculate a better top-value.