In glTF terminology, an "animation" is a unit of playback, a "channel" is a keyframe sequence within an animation targeting a single property of a single object, and a "sampler" containing "accessors" is the storage containing the channel's keyframe data.
In order to spin three boxes, you will always need to have at least three channels. Those three channels could be grouped into one animation for playback together, or separated so each can be played individually. In the screenshot above they are separate, but you can merge them by assigning each object an NLA Track of the same name in Blender — with default export settings, NLA Tracks with the same name are merged into a single animation at export.
However, whether there is one or three animations, there must still be three channels. This does not mean data is duplicated — all three channels can share the same sampler or accessors if exported efficiently. The https://gltf.report/ table shows the size of each animation, but doesn't show whether the animations share data or not.
If the animations did not share data (some exporters might not be fully optimized) you could detect and merge duplicate accessors by running this script in the https://gltf.report/ script tab —
import { dedup } from '@gltf-transform/functions';
await document.transform(dedup());