I don't know all the details of your problem, such as signal stability, timing accuracy and so on, so I'll presume a few things and suggest using an FFT based Gaussian ratio technique (download tutorial4 and related C++ code example at:)
The technique has been known, although not widely so, since 1991. Basically, it depends on using a Gaussian window on the input data, followed by an FFT, then it computes frequency and amplitude based on the natural log values of the FFT. A related technique is used at CERN, and they've done extensive analysis on it.
Based on your signals going up to 40 Hz, your minimum sample rate would be 80 Hz. But since your Fc is 55 Hz, if you have anything from 40 to 55 Hz, it will alias, so your minimum sample rate has to be at least 110 Hz. And your other requirements may force you to accept a higher rate.
But there are other issues independent of sample rate. First, you have sinusoidal signals from 10 to 40 Hz that exist for 200-300 msec (.2-.3 sec.). For a 10 Hz input, that works out to be only 2 to 3 cycles (and 8-12 cycles for a 40 Hz input). And keep in mind that a higher sample rate will not increase either the length of the signal or the number of cycles.
Second, since you have a 50-100 msec dead time between signals, you'll have to synchronize your processing with the input. You may want to have some kind of 'signal present' or 'not present' detector Given that your 10 Hz input would have a different rise/fall time than a 40 Hz input, such a detector may be overly complicated for you. So in the interest of keeping things simple, let's just presume your signal and dead time are stable with regards to their timing, and you can somehow determine when things start and stop.
So let's presume 300 msec signals, and 100 msec dead times for a total of 400 msec (.4 sec). Since you'll be windowing the inputs, it would be best if you had 50 msec of dead time, followed by 300 msec of signal, followed by 50 msec of dead time. Windows tend to deemphasize the beginnings and ends of signals, so the above would be desirable. Maybe you'd need to have a 50 msec dead time detector. As soon as you determine that exactly 50 msec of dead time have been received, you'd begin to receive the other 50 msec of dead time, then the 300 msec signal, and then another 50 msec dead time (total 400 msec). You might think that this is very simple - I can assure you that it isn't. Synchronizing things can present some pretty tricky coding problems, especially if you're using interrupts to get your A/D samples, (or you have asynchronous inputs).
Once you've collected one block of data, you'd apply the Gaussian window and compute frequency and amplitude. Then you'd wait for the next block. You may have to adjust your frequency and amplitude estimates somewhat if you're including the dead time in your FFT (no adjustment needed if you can synchronize exactly and pick out just signal only).
As for sample rate, you should probably plan on using 2 to 4 (or more) times the minimum of 110 Hz. So perhaps 200 to 400 samples/sec. would be appropriate. More samples/sec will help you better average out the noise. But it costs more in processing power.
Your FFT and buffer size will follow directly from your choice of sample rate. So if you choose 400 samples/sec, your 300 msec signal plus 100 msec dead time would require: 400 samples/sec x .4 sec = 160 samples. If your code libraries don't accommodate non-power of 2 FFT sizes, you'll have to crunch the numbers with that restriction in mind.