Можно ли избавиться от «слипания» байтов при WriteAsync из TcpClient.GetStream()?
Никак. TCP - это труба байт. Вы должны  самостоятельно разделять поток байт на пакеты.
Сделайте проще, создайте определенную структуру ваших данных. Но в самом начале выделите 4 байта под РАЗМЕР, например, у вас есть массив байт и 100 значений, запишите в начало потока 100 и на сервере/клиенте читайте ровно 100 байт, профит