I ran into it yet again last night, so I dug a little deeper. When I initially looked into it the other night, I came across info about TCP templates that are configurable using PowerShell. At the time, I didn't quite understand how the templates worked, but within the templates, there are a couple of extra settings that aren't able to be set using netsh.
There are essentially two tempates; Datacenter and Internet. If the initial TCP RTT is below 10 ms, it applies the Datacenter template. If above 10 ms, it applies the Internet template. More details here.
The idea of TCP templates also exists on Win 10, but it always applies the Internet template. If you try to change the behavior to match Win Server so that it automatically picks (New-NetTransportFilter -SettingName Automatic), it tells you the feature is only available on servers.
I ran Get-NetTCPConnection -RemoteAddress {ATV IP} last night when the issue occurred, and I saw it classifying the connection to the ATV as Datacenter.
From my observation, changes made using netsh update all templates, so those settings changes being made using netsh were actually applying.
Comparing the Internet and Datacenter templates settings (besides the ones I already listed in my earlier post), the only two differences are these:
Internet
MinRto(ms): 300
DelayedAckTimeout(ms): 40
Datacenter
MinRto(ms): 20
DelayedAckTimeout(ms): 10
I also looked at Wireshark when the issue was occurring and saw endless TCP retransmits as it was trying to buffer. My Google-fu tells me that MinRto is the minimum retransmission timeout, which is the length of time that it waits to receive an ACK of the data sent. So, my guess is that the minRto was set to too small of a value, and the ATV wasn't always able to send an ACK back within 20ms. Then, it just spiraled from there and threw everything of out of sync. I'm also wondering if the times I didn't see any issue that it was using the Internet template instead??
So, I changed the MinRto to 300 to match the Internet template, downloaded TCPView on the server and used it to kill the connections to the ATV, and the buffering issue immediately corrected itself without doing anything else on the ATV.
You can change it by running:
Set-NetTCPSetting -SettingName Datacenter -MinRtoMs 300
I also re-enabled MemoryPressureProtection for the Internet profile, set the InitialRto back to 1000 for the Datacenter profile, and enabled Fast Open using netsh.
Funnily enough, googling "Apple TV minrto" directed me to this thread of users having similar buffering issues with Plex's Enhanced Video Player with ATV and Win Server. It apparently fixed buffering issues for several folks using it. That's been within the past three days that they've come to that solution.
I've watched a couple of shows on a couple of different ATVs since then and haven't seen it so far. Given the success of users who reported it on Plex, I'm hopeful this is it.