Branch policy is something like the concept of check in policy in TFS. After enable check in policy, the user is required to take actions when they conduct a check-in to source control, for example a user can be required to associate a work item with a changeset or add a check in comment.
In the same way, after you setting up a branch policy, you cannot directly push changes to the branch. Changes to the branch are only made through pull requests.
Pull request is a feature name in TFS, it's nothing business with the concept of pull/push in git.
As for block users from merging/pushing, it's another concept Permission in TFS. Only users with Contribute permission can push new commits to the branch and lock the branch. If you are interested in this, you could take a look at here: Set branch permissions-GIT
Update
To push features into my master branch, you could use git command
git push origin branch1:branch2
More details please refer this question: Push commits to another branch
For I don't ever want someone to merge my develop branch into the master branch. You could set the permission of your develop branch, just deny other's Contribute permission on the develop branch.(Note: this will also disallow their push commits to your develop branch, there is not any only merge related permission in TFS Git)
If you want to use branch policy, you could prevent others merging your develop branch by setting must pass your code review. However, then you could not directly push features into the master branch
. The detail reason just refer the second paragraph in Martin's answer.
Another workaround is temporary locking your develop branch which ideal for preventing new changes that might conflict with an important merge or to place a branch into a read-only state.