This is one way to go about it:
- Spin up a stand-alone instance using the AMI
- Make changes
- Stop instance
- Create new AMI from this instance
- Create a new Launch Configuration that uses the new AMI
- Update the Autoscaling Group to use the new Launch Configuration
- Slowly terminate the old instances in the Autoscaling Group, and let them be automatically replaced with instances using the new AMI
Of course all this is a pain to deal with manually every time you need to make a change. Elastic Beanstalk and CloudFormat both provide mechanisms to deal with this in a more automated way.
If you are just changing the code you are deploying to your servers, then there are other ways to handle this, such as using AWS CodeDeploy. You could also update the running servers in some automated or manual fashion, and configure the AMI such that any new instances that are created will go get the latest code on startup.