With some good programming, you shouldn't need to know if it's on or off: you should already know that.
The 8 bits are used as addresses. Example:
First light bulb: 0000 0001
2nd: 0000 0010
3rd: 0000 0011
...
These zeros and 1's are binary "codes" that you can send out through the parallel port (or serial, or USB, or whatever you see fit).
The way you know how many you can address, is by taking the value "2" (# of possible values for each digit) to the power of the number of bits (digit), so 2 to the power of 8, is 256.
If you want more, you can cascade the data into two bytes, where the first specifies which submodule to address, and the second byte is the actual address, within that module. Then you'd have up to 256 possible "bulbs", for each 256 sub module address, so 65536 "bulbs". Of course there are much more practical ways to address that many "bulbs".
If you want to control 50 outputs, then you'd need at least 6 bits (i.e. two bits remain unused). You'd then need to figure out what type of interface you want to use, and get a module for VB to access that port.
If you do need to know the actual status (i.e. is it on or off) then you'd be better off dropping the parallel port, and go with a serial one, because it's easy to have data come back and forth. Parallel ports can do it, but you're talking about a bi-directional port, and it's nowhere near as common as what you can do with a standard RS-232 (serial) port.
If you want a challenge, do it through USB. If you're feeling a little nut, go through the Firewire port.