It’s important to be direct. Remember, you didn’t do anything wrong. Your guest did.
Since email tone can be misinterpreted I suggest calling and explaining that you’re sorry for the confusion - again this is not your fault - but due to spacing and budget issues you didn’t invite him with a guest and can’t have his date at the wedding.
You have two choices at this point. Either stand firm and don’t allow the date to come or you can offer that if enough people reply they won’t be able to make it you’ll make room for his date.
If this guest is from the groom’s part of the guest list you can have your groom make the call, but if your groom feels uncomfortable about it you can make it.