I think your problem is lack of understand of how binary protocols work. It is not an asyncio question (you would have the same issues with reading from plain old sockets).
Basically, your protocol should allow you to understand how big a message is just by reading the first few bytes of the message. Another approach is for the protocol to have markers telling you where each message ends.
Looking at your example, it sounds like you have the second approach. It is less efficient, but it can be done. Basically, read char by char until you find \x01, e.g.:
data = []
while True:
c = yield from stream.readexactly(1)
if c == b'\x01':
break
message = b''.join(data)
# process this message