新しいC#ソケットプログラミングを始めたばかりです。
Socket.ReceiveAsync()にSocketAsyncEventArgsを渡し、それを何度も再利用します。それは大丈夫です。
ただし、Socket.AcceptAsync()に対してこれを再度実行すると、InvalidOperationExceptionがスローされます。そのためにSocketAsyncEventArgsの新しいインスタンスを作成すると、問題ありません。
Socket.AcceptAsync()呼び出しごとにSocketAsyncEventArgsを作成する必要がありますか?(もしそうなら、Socket.ReceiveAsync()はどうですか?)