The automatic weights algorithm is not optimized for intersecting geometry, loose parts and non manifold meshes.
A simple solution is:
select the armature and make it visible "In front".
select the mesh, go to modifiers and click on the 2 tiny buttons with 3 and 4 vertices icon, to make it deforming in edit mode also.
select the armature, go to pose mode, select all bones, move them away 30 BU on the X axis (or anywhere away).
select the mesh, go to edit mode, box select all loose parts, press Ctrl L to add all linked geometry to the selection, press P to separate the selection into a new object.
In obj mode select the new object, shift select the armature, Ctr P > with automatic weights.
Select the new obj, shift select the main mesh, press Ctrl J to rejoin them.
In pose mode, select all bones and press Alt G, ALt R and Alt S to reset the rig.
This procedure enlights some of the many problems (errors) that the model has:
if the arms are supposed to bend, the inner cylinder hasn't enough geometry to follow properly.
If the arms are supposed to be rigid, there's no need of all thoose tiny bones: a single big bone is enough (as legs case).
The same applies for spine and neck.
All joints should be placed exactly in the center of some supporting geomtery loops, to avoid undesired deformations.
Boolean techinques should be avoided in the final deforming model (a complete retopology is necessary for a professional model); in general there is too many unneeded geometry, but too little where necessary.
It's convenient to prepare the rig in a correct scale (now it's 37 meters tall), facing the front in front view.