When you give an Array modifier an object-offset target, there is a transform that would take the original of the arrayed object to the target.
For example:
The original cube is the one at 3 o'clock. Although the cube's mesh is at X=2, the cube's pivot, the object, is at 0, and aligned to the world. It's the larger yellow axes in the picture. (The mesh was moved in Edit mode, leaving the object behind.)
In the picture, there is also an Empty at 0, the smaller orange axes. The transform that would take the cube object to the Empty is a rotation of 30 degrees. The Empty is the target of the object-offset array.
The transform that would take the original object to the target in an object-offset array is the one that's given to each iteration of the array, with respect to the previous iteration. So, above, each element of the array is rotated 30 degrees from the previous one, about its own object axes.
In short, to get a clean rotation, without a translation being added, too, the object's axes must be coincident with the target, just rotated, that's all.