The trick is to fill nums1 from the end. Place three pointers: one at the last real element of nums1 (index m-1), one at the end of nums2 (index n-1), and one at the last position of nums1 (index m+n-1).
Compare the elements at the first two pointers. Whichever is larger goes into the write position. Then move the relevant pointers backward.
Since you're writing to the back where there are only zeros, you never overwrite unprocessed data. This is why reverse-fill works perfectly here.