Why doesn't changing MAX_MONEY change the maximum number of coins? I've changed MAX_MONEY to decrease the number of coins issued in my altcoin, but it's not working.

Why?
Despite the name, the MAX_MONEY constant is not used in determining the total maximum number of coins.  Rather, it is used only for a sanity check: any transaction output larger than MAX_MONEY is automatically rejected as invalid.  They simply set this new constant equal to the eventual maximum number of Bitcoins, since that is a value that certainly should never be exceeded by any output.  This was part of the fix to an early bug where only the sum of all outputs for a transaction was checked, leading to the possibility that the addition might overflow.  

The block subsidy (aka reward) is computed in the 
GetBlockSubsidy function in validation.cpp.



CAmount GetBlockSubsidy(int nHeight, const Consensus::Params&amp; consensusParams)
{
    int halvings = nHeight / consensusParams.nSubsidyHalvingInterval;
    // Force block reward to zero when right shift is undefined.
    if (halvings &gt;= 64)
        return 0;

    CAmount nSubsidy = 50 * COIN;
    // Subsidy is cut in half every 210,000 blocks which will occur approximately every 4 years.
    nSubsidy &gt;&gt;= halvings;
    return nSubsidy;
}


Here you can see the initial block reward of 50 coins is hard coded.  The halving interval consensusParams.nSubsidyHalvingInterval is set in chainparams.cpp in the constructors for CMainParams, CTestNetParams and CRegTestParams respectively (the respective default values are 210000, 210000, 150).  Note that MAX_MONEY does not appear.

So in order to change your coin's total money supply, you'll need to do a little math to decide what the initial block reward and halving interval should be, and modify them accordingly.  If you want the reward adjusted by any other mechanism than "continue halving until the reward reaches zero", then you'll have to rewrite the 
GetBlockSubsidy function.  (And you should also change MAX_MONEY to an appropriate value that should never be exceeded by any transaction output.)