I know this is counter-intuitive but this is how IMAP works.
Expression.UID(Range.From(lastUID + 1))) issues the following query to the IMAP server:
20719a6078e94aeb UID SEARCH RETURN (ALL) UID 33548:*
33548:* is a range. For example 1:3 is range of three numbers: 1,2,3. As the order of the range endpoints is not important, 3:1 also represents 3 numbers: 1,2,3.
33548:* means a range between 33548 and the last UID, but it also represents a range between the last UID and 33548.
When 33548 is greater than the last uid in the folder (for example 101), this query represents all numbers from * (last uid) to 33548, which includes the last UID (101).
RFC 3501:
Also note that a UID range of 559:* always includes the UID of the
last message in the mailbox, even if 559 is higher than any assigned
UID value. This is because the contents of a range are independent of
the order of the range endpoints.
The workaround is to simply remove the lngLastReadUID from the list:
uids.Remove(lngLastReadUID );