The browser will retrieve the latest version if the browser cached version has expired. It will not do an HTTP GET request until that happens. This is intended behavior, because you want the speed of not having the delay of testing if there's a newer version. This, and a way around it, has been explained in the questions you refer to.
Amazon CloudFront will fetch your file and keep it until it expires. That expiration time is 24 hours or the expiration time set in the header when it fetched your file, whichever is shorter. It will not come and fetch another version, it won't even test if there is a newer version. That is also intended behavior, so that the edge server can quickly accomodate the browser without having to wait for your site (or S3) to respond. That's why it's so fast.
You can work around this by using Object Invalidation. This is a feature of Amazon CloudFront that allows you to explicitly delete the file from the CloudFront edge servers. It takes a couple of minutes to complete, and there's a cost involved if you do it too frequently, but in the case of a script or CSS file that infrequently changes I don't see this as a problem. There's an API for it, and some tools (notably Cyberduck) allow you to do it for files that are stored in S3.
Combine the two, and I think you have the solution to your problem.