Assuming I understand what you're looking to return, and assuming
subscriber.id is unique in the table (seems likely), here is a SQL Server answer (though it should be adaptable to MySQL):
isnull(sum((case when s.ispostpaid = 0 and s.subscriber_status = 'active' then 1 else 0 end)), 0) as prepaid,
isnull(sum((case when s.ispostpaid = 1 then 1 else 0 end)), 0) as postpaid
from subscriber s;
This selectively counts the rows of interest with one table access instead of an expensive cross join and grouping in the original query. The use of
ISNULL is to still return counts of 0 if the table is empty.
Using NHibernate, I believe this could also be written using
ICriteria... but it's been a while for me on that. Check out my answer here, as it might help if that's what you're looking for.