When the server crashes, the transaction on the DB is left in an inconsistent state and is rolled back… So all variable-updates and process-changes are rolled back. If you make sure you services use the same transaction, they get rolled back as well. If you have non-transactional services in the process I'm afraid you're on your own. This is the case with all combinations of transactional and non-transactional stuff anyways, not just activiti.
You can always make your service-task run asynchronously. This means that, when the process reaches the step in your process, It persists it's state and returns control to the tread. The execution of the service-task will be done by the job executor asynchronously. If you make all following service-tasks async, then after every execution of one, the state will be stored to the DB. This makes the frame of possible inconsistency much smaller.