Actually, you had the right idea in the first place. You missed it by thinking of "August 2014" as one date. It is not a date at all, it is an interval. An interval can be delimited by two dates, the date it starts and the date it ends. Or, in the case of an interval of a month, which is not a constant duration -- some are 30 days, some are 31, one is even less -- then use the start of the next month as the end date.
So the correct query will look amazingly similar to your example:
SELECT title_name
FROM titles
WHERE pubdate >= '2014-07-01'
AND pubdate < '2014-08-01';
And it has the added benefit of being sargable. That is, if pubdate is indexed, the index will be used. The search will start at the first book printed in August and stop when it reaches the first book printed after August. If you pass pubdate to a function, the index cannot be used and every pubdate in the entire table must be scanned.