Your choice of data and the viability of any other options depends hugely on the scale of your calculations.
Mapperz provides a couple of great links. However, you will have to add your own heights to features from these data as certainly the OS does not provide any information on the third dimension. That's fine for many of the small features you mention such as road signs as most of them are standard.
For trees and buildings you have more of a problem. However, if your area is small then you can try deriving building and tree heights using something like NextMap's LIDAR-derived DSM data (available from EMapSite for instance). It can get expensive for a good resolution though. Again for large stands of trees, you can try to obtain forestry records. This latter approach won't help you for individual urban trees though.
If your visibility calculation is really so detailed that individual road signs are critical, this suggests that you are working on a very small area, in which case it might even be more cost effective to invest in a cheap hipsometer and send a student on work-experience out to measure the features and record their locations with a GPS while you're at it.
Bear in mind though that there is not much point having hugely detailed and expensive information on the heights and widths of tiny objects like road signs (tiny in landscape terms) if you are using the OS 50m resolution Panorama height data. The free Panorama data contains many errors beyond those stated by OS. These include spikes and pits but also tiling artefacts such as trenches and ridges. On top of that, at 50m, sharp features tend to be smoothed. This doesn't matter if you are doing landscape scale visibility calculations over several kilometers but will matter if you are doing visibility calculations where an individual road sign must be accounted for. So, on top of your 3D features data you must also consider the resolution of your terrain data carefully. For your use-case, perhaps the OS 10m resolution data is not fine grained enough even?