when one of the hosts behind the hub (say, B) keeps receiving frames from other hosts connected to the same hub, but it never sends any frames itself
That's a general problem with or without a hub. Having no chance to learn B's MAC address as source, a bridge/switch would need to keep flooding frames for thatwith B as destination.
we end up with a perpetual single collision domain
No, we don't. A collision domain has nothing to do with flooding unknown MACs. The collision domain in your case ends at the switch port the repeater hub is connected to. The switch buffersbuffers frames and therefore separates collision domains (onlywhich are only present on ports in half-duplex mode).
the only way for the bridge to start filtering traffic between its ports in this case is that it receives at least one frame from each host behind the hub?
Yes, absolutely. Note that almost all scenarios require hosts to send frames rather early on after system or link up - DHCP, ARP, ...
Because the egress port turns out to be the ingress port, the frame won't be sent back and will get dropped instead as it should.
Yes, with 'destination port' rather than 'egress port'. 'Egress' implies sending rather than filtering.
wasn't this kind of behaviour problematic?
Not pratically, see above. Also, separation of collision domains is not directly connected to self-learning bridges. A hypothetical 'dumb' bridge without a port-MAC table could separate collision domains but would keep flooding all received frames all the time. You could simulate this using a switch configured with a zero-sized MAC table or a zero MAC-aging timer.
The main difference is that a repeater works on a bit-by-bit level. If there is a collision downstream (on an egress port) it must propagate that collision backwards to the ingress port since there's no buffer to save the frame in and the sender needs to be notified that its sending attempt failed. Furthermore, a repeater doesn't even know what a frame is.
A bridge or switch works on a frame-by-frame level. It receives a frame and then decides what to do with it. Any collision on an egress port doesn't need to be propagated back as the frame is still in the buffer and continues to be until it has been successfully sent out. A very simple bridge could mimic a repeater and flood every received frame to any other port, without looking at the MAC addresses. It would separate collision domains but couldn't optimize traffic in any way.
Since buffering requires some basic logic, we could use a bit more of that logic to implement a self-learning, intelligent bridge that learns sources and uses destinations to stop flooding and only forward a frame where it is needed. That is what nearly all bridges and all switches do.
Was this initial traffic somehow forced or was there simply an assumption that eventually every host would send something and nobody cared when exactly this would happen?
It's rather the other way around: a node starting up or activating a link is extremely likely to send something - a DHCP discovery, ARP request for its gateway or DNS server, some peer discovery or advertisement. That creates an excellent opportunity to have a bridge learn its MAC table automatically, so that's how it went.