Without mod_expires it will be harder to set expiration headers on your files. For anything generated you can certainly set some default headers on the answer, doing the job of mod_expires like that:
<?php header('Expires: '.gmdate('D, d M Y H:i:s \G\M\T', time() + 3600)); ?>
(taken from: Stack Overflow answer from @brianegge, where the mod_expires solution is also explained)
Now this won't work for static files, like your javascript files. As for static files there is only apache (without any expiration module) between the browser and the source file.
To prevent caching of javascript files, which is done on your browser, you can use a random token at the end of the js url, something like ?rd=45642111
, so the url looks like:
<script type="texte/javascript" src="my/url/myjs.js?rd=4221159546">
If this url on the page is generated by a PHP file you can simply add the random part with PHP. This way of randomizing url by simply appending random query string parameters is the base thing upôn no-cache setting of ajax jQuery request for example. The browser will never consider 2 url having different query strings to be the same, and will never use the cached version.
EDIT
Note that you should alos test mod_headers. If you have mod_headers you can maybe set the Expires headers directly with the Header keyword.