You can solve this without modifying the array by binary searching on the answer. Remember that we are looking for the smallest positive integer that is not in the array. This means the answer can't be larger than n + 1 since we only have n numbers in our array. So we just need to binary search between 1 and n + 1 to find our answer.
Within our binary search, we want to answer the question: for a given number k, is every integer 1 through k contained in our array? Because there are no duplicates, we can solve this by just counting the number of elements in the array less than or equal to k. If the count is k, every such integer is in our array; otherwise, at least one is missing.
So we binary search to find the smallest value of k where the above property is false. The binary search requires O(log n) iterations, and each iteration takes O(n) time for a total of O(n log n) time. The space is actually O(1) since all we need is a single variable for counting.