These two functions seem to behave in a similar way.
And it looks like that with using xEventGroupWaitBits(), you can make the RTOS behave the same way as using xEventGroupSync().
(by setting xClearOnExit parameter to pdTRUE and xWaitForAllBits to pdTRUE)
Am I missing something? Or is there another function in xEventGroupSync() that I didn't understand?
xEventGroupsSync() sets bits then waits for bits.
xEventGroupWaitBits() only waits for bits.
So the two functions are quite different.
xEventGroupSync() is equivalent to calling xEventGroupSetBits() bits followed by a call to xEventGroupWaitBits() BUT does it in an atomic way. Calling the two functions separately to try and effect what is commonly called a task rendezvous will not work because of the race conditions it creates - hence you use xEventGroupSync() instead. Many other RTOSes that don't have this atomic set then wait capability.
So is Wait is the same as calling Sync without setting any bits.
Not really. It does not make sense to call Sync without setting any bits, so in a real world example they can't really be considered as equivalent. I suppose you could call Sync without setting any bits, but why would you if you can set the parameters of the Wait function to do the same thing in a more efficient way?