Scanning and pulling (downloading) are mutually exclusive, but they can happen on parts of the data, that is if the directory is being populated with data as the scan is running, its possible that we’ll only discover parts of data and send indexes for that part, pull some other data, and go back to scanning. If all the data is already there prior a scan, then scan should run until all data is scanned. As data is scanned and added to the index, there is a separate routine in the background dispatching the index to remote devices (you could say in parallel to the scan). As remote devices get the indexes they will start pulling the data from remote device, and the remote device is able to serve pull requests while its scanning or pulling itself.
There are quite a few UX features that make initial scans and downloads on large data sets slow in favor of better ux. One is scan progress interval, other is pull progress interval, these should be set to negative values in the advanced config in your case. (On my phone, can’t give exact names, sorry).
The out of sync status is based on the version of the file, not the data itself, so we might look we are terabytes away from being in sync, yet download nothing when we go into pulling once we realize that the content between the different versions is the same.