var prechecksub = "checksub" + cat;
alert(document.catcheckboxes.prechecksub.length); // this doesnt work, there is no such html element as prechecksub, it is made in JS.
innerHTML is not a standard DOM method, thus it might not insert quite well the new elements or their attributes into the DOM tree. I would have rather use DOM standard methods to create and append a new element (createElement(), setAttribute() and so on)
On the other hand, you may try something else: in case of a single radio or checkbox element referenced by name, the classical reference (document.formname.elementname) could fail. Try first the DOM 1+ method:
Keep in mind that getElementsByName() method is to be used only upon form's elements (well, it works upon images, frames and links as well, but I woun't bet on the future of) and will return always a collection (that means you always need an index to point a certain element)