I discovered that if a crossbow bolt strikes an object and there is no floor beneath it when it strikes, instead of being broken and "used up" it will fall harmlessly to the level below. I then had a genius idea: If I dug a channel in front of my archery targets, then I'd be able to recover all of the bolts my marksdwarves fire!
Slight problem though: Marksdwarves will refuse to use a target unless it has solid unbroken floor between the marksdwarf and the target. As soon as I dug my ammo-catching channel, my dwarves all stopped doing any target practice whatsoever. I even tested this with a lever-operated hatch. When the hatch was closed my dwarf was shooting away, but as soon as I pulled the lever to open the pit he cancelled his task with 17 bolt left in his quiver and wandered off. Well, there goes that scheme for unlimited ammo.
I did however notice that dwarves will often slightly miss their target one square to the left or right. This means that not every bolt will land in front of the target they are shooting at, which means that you can set up ammo-collection pits in places that won't interfere with shooting. I came up with the following plan:
vXvXvXv
v v v v
v v v v
v v v v
v v v v
v v v v
X = Archery target, v = channel
Alternate your archery targets with channels and any bolts which miss the target will fall into the pits and can be recycled. I think that the further back your marksdwarves stand, the lower their chances are of hitting the target. If this is the case then making your archery ranges as long as possible will be the most efficient way to recycle your ammunition.