lock
is not free. it has to check for certain things before returning. How many things and what it has to do, depends on implementation. I would guess that this kind of use is common and MS did some optimization for this usecase.
I'd still recommend that you'd have a separate implementation of AddRange with all the things done in one shot. This of course depends on the rest of the class' interface (are there listeners and can they receive messages that several objects were added etc.).
This is fairly easy testcase, do some millions of nested locking (what you propose) and the same with an other lock.
Notice also the different possible order if you use non-nested lock, you may get an object in middle of a range you're adding:
AddRange _sync1
AddItem _sync2
AddItem _sync2
--- interruption, other thread calls:
AddItem _sync2
--- AddRange again:
AddItem _sync2
When syncing with a single _syncObject, nobody can interrupt because the lock is already held by another thread.