It seems that you never write to BoidData.avoidanceHeading...and conversely you never read from the struct Boid.separationHeading.
When you read the data out of the compute buffer do the variable names not matter? Does it automatically convert the Boid struct into the BoidData struct based on the types of data and not the variable names?