There's your clue right there.
If it helps, I think this problem is about a 9.4 on the scale of the 'what the heck is going on with my AppleScript' scale. It's subtle.
Conceptually, this comes down to the fact you're targeting a moving list.
Consider the line:
repeat with this_item in entire contents of this_folder
Internally, this_item is a a counter that increments on each iteration of the loop - first iteration is 1, second is 2, etc.
Additionally entire contents of this_folder is not an object (or a list), it is command.
The line is more clearly seen as:
repeat with this_item in (get entire contents of this_folder)
Why is that significant?
Well, let's assume there are 10 items in the folder.
On the first iteration, this_item is 1, and AppleScript goes off and gets entire contents of this_folder (10 items), and it extracts the first item. All well and good.
On the second iteration, this_item is 2. It goes off again and finds the entire contents of this_folder. However, this time there are only 9 items in the folder because you already moved one out. The script doesn't think anything of that, and it simple moves the second item from this list of 9 files.
On the third iteration, this_item is 3, and entire contents of this_folder is a list of 8 items, so it skips the first two
and so on.
So the fault is that you recalculate what 'entire items of' the folder is on each iteration, leaving half the files behind.
The fix is simple - put the list of files into a list, and iterate over that list, rather than recalculating the list every time (the script will also be much faster since it only calculates the list of files one time):
tell application "Finder"
set theListOfFilesToMove to (entire contents of this_folder)
repeat with this_item in theListOfFilesToMove
...
In this way you get the list of files, store then in a variable and iterate over that. Problem solved.