Trying to return a complete column from one table, and a count from another table
I think I was able to accomplish what you want using the following query:

SELECT c.name, coalesce(billcount, 0) FROM customers c
LEFT JOIN (
    SELECT c.name, c.customerid, COUNT(DISTINCT b.billid) as billcount from customers c
    JOIN bills b 
    ON b.customerid = c.customerid
    WHERE b.createdate = CURDATE() -INTERVAL 1 DAY
    GROUP BY b.customerid
) bc
on bc.customerid = c.customerid


Essentially I just put your original query in a subquery (the indented area between the parenthesis), and left joined the columns you wanted with the results from that subquery.

This will always return a full list of customers and the number of bills they have, if any. Right now it's returning 0 for the customers that don't have any bills in the given time range. If you prefer it to return null, omit the coalesce() function and just use billcount in the column list on the first line. (Obviously you can rename this column to whatever you want.)