Controlling MSP430 PWM with a Laptop
Change the:

TA0CCR1 |= (duty_cycle*100);

To a simple assignment:

TA0CCR1 = (duty_cycle*100);

Otherwise you are OR'ing the previous value with the new one, eventually filling it with ones.  That is why you can't go back to a lower duty cycle.

By the way, I don't know if your MSP430 has a hardware multiplier, but if it doesn't you should avoid direct multiplications whenever possible because they may take quite a few cycles to execute.  Use instead powers of 2 (like 128), because you only need to left-shift the value.