The only thing the caller ever asks this queue is List.length items > 8, and it asks repeatedly. The queue is one immutable OCaml list, and every update returns a new queue. Two options are on the table. Carry an exact count, or expose a threshold query.
With (items, count), the pair pattern names both components, and from then on count = List.length items has to hold after every update. Enqueue adds one. A successful dequeue subtracts one. Dequeuing an empty queue leaves zero. Any constructor that takes both components has to keep them in step too.
The threshold version is smaller. List.compare_length_with items 8 > 0 says exactly what the caller wants, and the OCaml 5.4 documentation says this comparison may stop after at most the supplied number of iterations. Right now nobody asks for the count itself, which makes me suspicious of storing one.