A good way to think of it is when you import a key to your wallet all of its inputs are added to the "input pool" as i like to call it. When a sendtoaddress or sendmany command is initiated it will pull what it thinks are the best inputs to make that transaction from the "input pool". Keys can be added/removed from accounts at any time taking their inputs with them. (although a rescan is required and done by default which takes some time)
This is the way its designed to work. But if you want to customize it to work with you it is possible. Just always be cautious of modifying and know what your doing. Mistakes with bitcoin transaction are irreversible and can be quite costly. You have a few options.
Accounts are usefull for this. A wallet can have multiple accounts. Think of accounts as a way to group keys together. You could make a new account for each user then use the sendfrom command to initiate all withdrawals from the wallet.
bitcoind sendfrom "fromaccount" "tobitcoinaddress" "amount" [minconf=1]
Where "fromaccount" is the account you want to send from. "tobitcoinaddress" is the destination. "amount" is the amount you want to send and [minconf=1] will not allow it to spend any input with less than 1 confirmation or any value you specify.
This will send only from the account you specify. Each account can have as many addresses as you like or just one.
Just be aware accounts should never be used for balance tracking. Only for groupings of keys. And if you ever use the sendto or sendmany commands they will pull the inputs from all accounts to make the withdrawal