Items with notforloan setting ≠ 0 [so 1 or -1, for example] CAN be checked in and CANNOT be checked out -- both expected behaviors. However, items with notforloan ≠ 0 CAN trigger a branch transfer and put an item into transit for a hold. I don't think items should be able to trigger a transfer at all on checkin, if the item still has notforloan ≠ 0.
I cannot reproduce this issue on master ( db rev 3.17.00.008, commit 7181de4f1ca8e282990c4c624154b658ea0d644f );
With the new UpdateNotForLoanStatusOnCheckin sys pref in 3.18, this is no longer an issue. I hope it's okay, I'm marking this resolved.