While maintaining separate armatures for each linked duplicate would work, it sure sounds painful to me. The linked object shares its vertex groups among all duplicates, so every duplicate needs the weights of every single duplicate, and you need a separate armature for every single screw. (Limiting these by vertex groups in the armature modifier wouldn't help, not without dynamically assigning vertex groups.) If any of these objects have overlapping weights, then the separate armatures would need their bones renamed. It sounds like it would be very difficult to implement and worse to manage. Rather than describing how this could be done, I'll provide alternative solutions.
In your case, the objects you're talking about sound rigid, non-deforming, which means that bone parenting would be the best solution. While linked duplicates share their vertex groups, they can have independent parents. We can parent them to different bones:
In the case that we want them to have "weights", following multiple bones, we can simulate weights by creating a new, unparented bone (in the same armature, preferably) with an armature constraint:
I suppose you could put the armature constraints directly on the objects themselves, but my preference is that if I'm using bones for anything, I'm using them for everything. I don't like having to troubleshoot stuff that combines object and bone constraints.
If these meshes do need to deform rather than remain rigid, then we might do that by assigning vertex groups with a modifier:
Here, rather than weighting the linked duplicate directly, I use a live data transfer modifier to copy weights from some other object. All objects have the vertex groups needed to deform from the armature, but those weights are replaced by the data transfer modifier. The target of the data transfer modifier should not itself get deformed by the armature, and should probably be hidden in renders.